如何在 Swift 3、URLRequest 上使用 httpMethod = POST?

Swi*_*per 1 json httprequest ios swift

我正在json使用GET方法获取代码,但是当我将其转换为POST添加时;

  request.httpMethod = "POST"
Run Code Online (Sandbox Code Playgroud)

给我 ;

无法分配给属性:“httpMethod”是一个仅获取属性错误

我下面的代码如何解决?我怎样才能将它转换为POST

 @discardableResult
    open func  getLoginMethod(_ method: String, parameters: String, completionHandler: @escaping (_ login: [Login]?, _ error: Error?) -> Void) -> URLSessionTask! {
        let session = URLSession.shared
        guard let url = NSURL(string: parameters) else {
            completionHandler(nil, myErrors.InvalidUrlError)
            return nil
        }
        let request = NSURLRequest(url: url as URL)

        let task = session.dataTask(with: request as URLRequest) { data, response, error in
            if error != nil {
                completionHandler(nil, myErrors.getError)
            } else {
                do {
                    let login = try self.getLogin(jsonData: data! as NSData)
                    completionHandler(login, nil)
                } catch {
                    completionHandler(nil, error)
                }
            }
        }
        task.resume()

        return task
    }
Run Code Online (Sandbox Code Playgroud)

还有我在下面的调用代码,用于get方法内部的变量parameters,对于POST我需要更改的方法?

  AWLoader.show(blurStyle: .dark, shape: .Circle)

        DispatchQueue.global(qos: .background).async {
            myApp.sharedInstance().getLoginMethod("", parameters: "http://bla.com/Post?Phone=\(self.phone.text)") {login, error in
                if error != nil {
                    DispatchQueue.main.async {
                        //  self.showAlert()

                        print(error!)

                        AWLoader.hide()
                    }
                } else {
                    DispatchQueue.main.async {
                        self.getlogin = login!
                        //    self.collectionView.reloadData()
                        //       AWLoader.hide()

                        //  self.loginButton.alpha = 0
                        print(self.getlogin)


                        AWLoader.hide()
                    }
                }
            }


        }
Run Code Online (Sandbox Code Playgroud)

谢谢

Kro*_*dak 5

您需要使用NSMutableURLRequest才能修改httpMethod. 使用NSURLRequest不行。

例子:

let request = NSMutableURLRequest(url: url)
request.httpMethod = "POST"
Run Code Online (Sandbox Code Playgroud)

但更好的是,您应该使用URLRequest结构:

var request = URLRequest(url: url)
request.httpMethod = "POST"
Run Code Online (Sandbox Code Playgroud)

您的重构代码具有额外的改进:

@discardableResult
open func getLoginMethod(_ method: String, parameters: String,
                     session: URLSession = .shared,
                     completionHandler: @escaping (_ login: [Login]?, _ error: Error?) -> Void) -> URLSessionTask! {

    guard let url = URL(string: parameters) else {
        completionHandler(nil, myErrors.InvalidUrlError)
        return nil
    }
    var request = URLRequest(url: url)
    request.httpMethod = method
    let task = session.dataTask(with: request) { data, _, _ in
        guard let responseData = data else {
            completionHandler(nil, myErrors.getError)
            return
        }
        do {
            let login = try self.getLogin(jsonData: data as NSData)
            completionHandler(login, nil)
        } catch {
            completionHandler(nil, error)
        }
    }
    task.resume()

    return task
}
Run Code Online (Sandbox Code Playgroud)

编辑:回答问题的第二部分。这取决于您的 API 期望什么样的数据格式 - 无论是应该是格式multipart/form-data还是json格式,这一切都取决于。但总的来说,假设您使用的URLRequest是我提到的 struct ,您应该将其转换为Data使用您的序列化程序并像这样使用它:

var request = URLRequest(url: url)
request.httpMethod = "POST"
request.httpBody = <your parameters converted to Data>
Run Code Online (Sandbox Code Playgroud)

通常,您的 API 会期望将正确的Content-Type标头添加到您的URLRequest:

request.setValue("application/json", forHTTPHeaderField: "Content-Type")
Run Code Online (Sandbox Code Playgroud)