gpt4 book ai didi

swift - 使用 Alamofire 调用带有 HTTP header 和正文的 API

转载 作者:行者123 更新时间:2023-11-30 12:49:56 25 4
gpt4 key购买 nike

我正在尝试使用 Alamofire 4 重新创建一个已在 Swift 3 中的 Postman 中工作的 POST 请求,但我总是收到状态代码 400“错误请求”。我不知道我在这里做错了什么。

这是Postman中的请求,另外Body中有一个JSON格式的用户名和密码: Working Postman Call

阅读 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

是否有一个我必须实现的自定义 session 管理器?或者你知道我可以在这里使用任何调试方法吗?

最佳答案

一位熟悉 API 的 friend 确实帮助我解决了这个问题:这是一个默认的 header 字段,似乎是 Alamofire 添加到每个调用中的。 API 不接受设置了“用户代理”的调用(不要问我为什么)。

为了帮助其他可能遇到相同问题的人,我分享了我查找和解决问题所经历的步骤:

  1. 我将 Alamofire.request(...) 放入名为 postage 的变量中(当然,您可以随意调用它)
  2. 我将 debugPrint(postage) 添加到 login 函数的末尾
  3. 输出显示了附加 header 字段
  4. 我构建了一个如下所示的自定义 SessionManager

    var headers = Alamofire.SessionManager.defaultHTTPHeaders
    headers.removeValue(forKey: "User-Agent")

    let configuration = URLSessionConfiguration.default
    configuration.httpAdditionalHeaders = headers

    api = Alamofire.SessionManager(configuration: configuration)

关于swift - 使用 Alamofire 调用带有 HTTP header 和正文的 API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41131498/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com