【问题标题】:Swift API call with URLSession gives 504 error使用 URLSession 的 Swift API 调用给出 504 错误
【发布时间】:2019-01-24 00:44:45
【问题描述】:

我有一个使用 oauth 的 API 调用,我在邮递员中使用正确的授权令牌进行了测试。我在邮递员中得到了正确的响应。但是当我在 Swift 中尝试同样的事情时,我得到 504 错误。

我已经正确检查了每个参数和标题,一切看起来都和邮递员一样。不知道为什么同样的东西在邮递员中工作并在 swift 中给出 504 错误。可能是什么问题?

var params = [String : String]()
params["Id"] = Id;

var headers = [String : String]()
headers["api-key"] = "XXXXXX"
headers["Authorization"] = "Bearer XXX" 

do{
    var request = URLRequest(url: URL(string: getURL())!)
    request.allHTTPHeaderFields = headers
    request.httpBody = try JSONSerialization.data(withJSONObject: params , options: [])
    request.httpMethod = "GET"
    let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
        let httpResponse = response as! HTTPURLResponse
        print(httpResponse)
    }
    task.resume()
}catch{
}

【问题讨论】:

  • 你是否尝试过使用 postman 测试 api,通过完全相同的paylaod,如果它工作?
  • 是的,它在邮递员中工作
  • 如果它与 POSTMAN 一起工作,你知道它可以生成 Swift 代码吗?它并不总是“好”的代码,您可以尝试一下(如果它有效),然后它可能会帮助您发现参数、标头等方面的差异。

标签: swift urlsession http-status-code-504


【解决方案1】:

使用 GET 请求时,请求没有正文。一切都在 URL 上。

您还确定在 Postman 中您只使用这 2 个标头吗?

看看这样的东西是否适合你:

var params: Parameters = Parameters()
params.updateValue(Id, forKey: "Id")

var components = URLComponents(string: getURL())!
components.queryItems = params.map { (key, value) in
    URLQueryItem(name: key, value: value)
}
components.percentEncodedQuery = components.percentEncodedQuery?.replacingOccurrences(of: "+", with: "%2B")
let request = URLRequest(url: components.url!)
request.setValue("XXXXXX", forHTTPHeaderField: "api-key")
request.setValue("Bearer XXX", forHTTPHeaderField: "Authorization")
request.httpMethod = "GET"
let task = URLSession.shared.dataTask(with: request) { data, response, error in
    guard let data = data, error == nil else {                                                 // check for fundamental networking error
        print("error=\(error)")
        return
    }

    if let httpStatus = response as? HTTPURLResponse, httpStatus.statusCode != 200 {           // check for http errors
        print("statusCode should be 200, but is \(httpStatus.statusCode)")
        print("response = \(response)")
    }

    let responseString = String(data: data, encoding: .utf8)
    print("responseString = \(responseString)")
}
task.resume()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-22
    • 1970-01-01
    • 2018-04-11
    • 1970-01-01
    • 2017-03-24
    • 1970-01-01
    • 2020-09-11
    • 2020-04-30
    相关资源
    最近更新 更多