首页 > 解决方案 > HTTP 发布请求并在应用程序中保存响应

问题描述

我对 swift 和 iOS 编程完全陌生,所以我对如何执行此操作甚至在哪些文件中我也应该执行此操作有点迷茫。

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

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

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.
    }

}

接下来我该怎么办?

标签: swift

解决方案


此时您需要创建一个函数来处理您发出的 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)")
        
    }
}

推荐阅读