我试图重新创建一个POST请求,该请求已经在Swift 3中使用Alamofire 4在Postman中运行,但我总是得到状态码400"错误请求"。我不知道我在这里做错了什么。
这是Postman中的请求,另外在Body中有JSON格式的用户名和密码:
阅读Alamofire的文档,我认为这应该是正确的Swift代码:
func login(as username: String, withPassword password: String) {
let url = "https://api2.drive-now.com/login"
let parameters: Parameters = [
"username" : username,
"password" : password
]
let loginHeaders: HTTPHeaders = [
"Accept" : "application/json;v=1.6",
"Accept-Encoding" : "gzip, deflate, sdch",
"Accept-Language" : "de-DE,de;q=0.8,en-US;q=0.6,en;q=0.4",
"Connection" : "keep-alive",
"Host" : "api2.drive-now.com",
"Origin" : "https://de.drive-now.com",
"X-Api-Key" : "adf51226795afbc4e7575ccc124face7",
"X-Language" : "de",
"Content-Type" : "application/json"
]
Alamofire.request(url, method: .post, parameters: parameters, encoding: JSONEncoding.default, headers: loginHeaders).responseJSON { response in
print("Request: \(response.request)") // original URL request
print("Response: \(response.response)") // HTTP URL response
print("Data: \(response.data)") // server data
print("Result: \(response.result)") // result of response serialization
if let JSON = response.result.value {
print("JSON: \(JSON)")
}
}
}
我的控制台输出是:
Request: Optional(https://api2.drive-now.com/login)
Response: Optional(<NSHTTPURLResponse: 0x6000000266a0> { URL: https://api2.drive-now.com/login } { status code: 400, headers {
Connection = close;
"Content-Length" = 181;
"Content-Type" = "text/html";
Date = "Tue, 13 Dec 2016 22:12:46 GMT";
Server = "nginx/1.4.6 (Ubuntu)";
} })
Data: Optional(181 bytes)
Result: FAILURE
我是否必须实施自定义会话管理器?或者您知道我可以在这里使用的任何调试方法吗?
答案 0 :(得分:0)
习惯API的朋友确实帮我解决了这个问题:它是一个默认的标题字段,似乎是Alamofire为每次调用添加的。 API不接受设置了“User-Agent”的调用(不要问我原因)。
为了帮助可能遇到同样问题的其他人,我分享了我找到并解决问题的步骤:
Alamofire.request(...)
变成了一个名为postage
的变量(当然,你可以调用它)debugPrint(postage)
- 函数login
我构建了一个自定义SessionManager,如下所示
var headers = Alamofire.SessionManager.defaultHTTPHeaders
headers.removeValue(forKey: "User-Agent")
let configuration = URLSessionConfiguration.default
configuration.httpAdditionalHeaders = headers
api = Alamofire.SessionManager(configuration: configuration)