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)
谢谢
您需要使用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)
| 归档时间: |
|
| 查看次数: |
8884 次 |
| 最近记录: |