swift - 将 ecobee Alamofire 请求转换为使用 URLSession
问题描述
作为我最后一个问题(用于 ecobee 请求的 Alamofire 语法)的后续,我宁愿只使用 URLSession 来处理请求。
现在我回到使用以下代码以状态 408 超时的请求:
guard let url = URL(string: "https://api.ecobee.com/1/thermostat") else { return }
let jsonParameters = [ "selection": [ "selectionType": "registered", "selectionMatch": "" ] ]
let jsonData = try! JSONEncoder().encode(jsonParameters)
let jsonString = String(decoding: jsonData, as: UTF8.self)
let queryParameters = ["format": "json", "body": jsonString]
let headers: HTTPHeaders = [.authorization(bearerToken: AUTH_TOKEN), .contentType("text/json")]
var request = try! URLRequest(url: url, method: .get, headers: headers)
request.httpBody = try! JSONEncoder().encode(queryParameters)
URLSession.shared.dataTask(with: request) { (data, resp, err) in
debugPrint(String(data: data!, encoding: .utf8)!)
}.resume()
我怀疑我没有正确添加查询参数。
解决方案
我使用 UrlComponents 找到了自己的解决方案
func testRequest() {
guard var url = URLComponents(string: "https://api.ecobee.com/1/thermostat") else { return }
let jsonParameters = [ "selection": [ "selectionType": "registered", "selectionMatch": "" ] ]
let jsonData = try! JSONEncoder().encode(jsonParameters)
let jsonString = String(decoding: jsonData, as: UTF8.self)
let queryParameters = ["format": "json", "body": jsonString]
url.queryItems = queryParameters.map { URLQueryItem(name: $0.key, value: $0.value) }
let headers = [
"Authorization": "Bearer \(core.accessToken)",
"Content-Type": "application/x-www-form-urlencoded; charset=utf-8"
]
var request = URLRequest(url: url.url!)
request.httpMethod = "GET"
request.allHTTPHeaderFields = headers
URLSession.shared.dataTask(with: request) { (data, resp, err) in
debugPrint(String(data: data!, encoding: .utf8)!)
}.resume()
}
推荐阅读
- .net - 八达通部署中的部署错误
- visual-studio - 如何在 Visual Studio 中仅测量单元测试的 ACT 部分?
- performance - 在 htaccess 中使用 mod_deflate 缓慢的站点响应 - 但为什么呢?
- python - 是否可以在 django 项目中使用多个 aws ses 帐户?
- php - Yii2 - 为不同的控制器使用两个提交按钮
- r - 非对称表列表
- spring - 关闭 TaskScheduler 不会停止运行 @Scheduled 方法
- jquery - 更改“data-image”属性的值
- reactjs - 在 React JSX 字符串中嵌套变量
- mysql - mysqldump 兼容模式 postgresql 不工作