代码之家  ›  专栏  ›  技术社区  ›  Nancy

HTTP发布请求并在应用程序中保存响应

  •  0
  • Nancy  · 技术社区  · 3 年前

    我对swift和iOS编程完全陌生,所以我有点不知道如何做到这一点,甚至不知道我应该在什么文件中做这件事。

    我正在尝试执行http post请求以获取日历事件并将其保存在应用程序中以供以后使用和显示。

    我用这段代码创建了一个模型类。

    import UIKit
    
    class Event {
        var id: Int
        var init_date: String
        var end_date: String
        var title: String
        var description: String
        var color_code: String
        var all_day: Int
        
        
        init?(id: Int, init_date: String, end_date: String, title: String, description: String, color_code: String, all_day: Int) {
            
            //Initialization should fail if these are false
            if  id < 0 || init_date.isEmpty || end_date.isEmpty || title.isEmpty {
                return nil
            }
            
            //Initialize stored properties
            self.id = id
            self.init_date = init_date
            self.end_date = end_date
            self.title = title
            self.description = description
            self.color_code = color_code
            self.all_day = all_day
        }
    }
    

    但现在我不知道下一步会是什么。我需要在应用程序第一次打开时立即下载,而不是在它不是第一次打开的时候。我是否要在ViewController.swift中为下载创建一个新方法?

    现在我还没有向ViewController添加任何内容

    import UIKit
    
    class ViewController: UIViewController {
    
        override func viewDidLoad() {
            super.viewDidLoad()
            // Do any additional setup after loading the view.
        }
    
    }
    

    接下来我该怎么办?

    1 回复  |  直到 3 年前
        1
  •  0
  •   Julian Silvestri    3 年前

    此时,您需要创建一个函数来处理您正在发出的POST请求。

    完成后,将此函数放置在appDelegate主函数didFinishLaunchingWithOptions中。这是在appStart上执行的函数

    在成功调用函数时,将数据(可能是json)保存到全局变量或应用程序所需的任何文件中。

    提示: 在你的课堂上

    class Event: Codable {
    
    }
    

    确保添加如上所述的Codable

    下面是一个你的帖子请求的示例

        func myPostRequest(completionHandler: @escaping (Bool?, String?) -> Void){ 
    guard let url = URL(string:"") else { return }
        
        let parameters = ["": ""]
        
        var request: URLRequest = URLRequest(url: url)
        
        request.httpMethod = "POST"
        request.setValue("application/json", forHTTPHeaderField: "Content-Type")
        request.setValue("", forHTTPHeaderField: "Authorization")
        
        do {
            
            request.httpBody = try JSONSerialization.data(withJSONObject: parameters, options: .prettyPrinted)
            
            let task = URLSession.shared.dataTask(with: request) { data, response, error in
                
                guard
                    
                    error == nil
                    
                else {
                        
                    print(error as Any)
                        
                    return
                        
                }
                
                if let httpResponse = response as? HTTPURLResponse {
                    
                    if (httpResponse.statusCode == 200) {
                        
                        if let data = data {
                            
                            let json = try? JSONSerialization.jsonObject(with: data, options: []) as? [[String: Any]]
                            //print("^^^^^^^^^^^^^^",json)
                            
                            
                            for x in json ?? [] {
                                //here is where you will parse your data from the post request
                                
                            }
                            
                            completionHandler(true, nil)
                            
                            return
                            
                        }
                        
                    } else {
                        
                        completionHandler(false, "No Response From Server")
                        print("Failure response: STATUS CODE != 200")
                        
                    }
                    
                } else {
                    
                    completionHandler(false, "Database Connection Error")
                    print("Error \(error!)")
                    
                }
                
            }
            
            task.resume()
            
        } catch let error {
            
            completionHandler(false, "failure")
            print("POSTERROR: \(error.localizedDescription)")
            
        }
    }
    
        2
  •  0
  •   Eric    3 年前

    我用 Alamofire ,您可以通过以下方式将其添加到您的项目中:

    1. 豆荚
    2. Swift包管理器

    当你添加框架时,你可以使用它:

    import Alamofire
    

    然后你需要用协议来上课 Codable 将数据传递给你的班级。

    class Event: Codable { }
    

    然后你需要打电话给 url 并将响应存储在变量中:

    override func viewDidAppear(_ animated: Bool) {
            AF.request("your API rest url").responseData { (resData) in
                guard let data = resData.data else { return }//Check if the data is valid
                
                do {
                    let decoder = JSONDecoder()//Initialize a Json decoder variable
                    let decodedData = try decoder.decode(Event.self, from: data)//Decode the response data to your decodable class
                    //Print the values
                    print(decodedData.headers)
                    print(decodedData.id)
                    print(decodedData.init_date)
                    print(decodedData.end_date)
                } catch {
                    print(error.localizedDescription)
                }
            }
        }