我正在尝试使用Alamofire从Swift 4中找到调用ecobee API的正确语法。
他们的cURL示例:
curl -H "Content-Type: text/json" -H "Authorization: Bearer ACCESS_TOKEN" 'https://api.ecobee.com/1/thermostat?format=json&body=\{"selection":\{"selectionType":"registered","selectionMatch":"","includeRuntime":true\}\}'
我最接近解决方案的是这个
func doRequest() {
guard let url = URL(string: "https://api.ecobee.com/1/thermostat?format=json") else { return }
let parameters: Parameters = [
"selection": [
"selectionType": "registered",
"selectionMatch": ""
]
]
let headers: HTTPHeaders = [
"Content-Type": "text/json",
"Authorization": "Bearer \(core.accessToken)"
]
let req = AF.request(url, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: headers)
.responseJSON { response in
print("Error:", response.error?.localizedDescription ?? "no error")
print("Data:", String(data: response.data!, encoding: .utf8)!)
}
debugPrint(req)
}
当我运行它时,调用最终失败,状态码为408,服务器超时。
当我将HTTP方法更改为使用.post时,调用完成,但响应是内部状态3,并显示消息“由于通信错误导致更新失败”。
任何人都可以帮我弄清楚我做错了什么之后再浪费一天试图破解我的方式吗?
Ecobee的请求格式有点奇怪,因为它使用表单编码参数,但其中一个值是JSON编码体。你必须做一些准备工作,因为Alamofire自然不会支持这样的事情。这只是示例代码,您需要完成工作以使其更安全。
首先,编码JSON参数并获取String
值:
let jsonParameters = ["selection": ["selectionType": "registered", "selectionMatch": ""]]
let jsonData = try! JSONEncoder().encode(jsonParameters)
let jsonString = String(decoding: jsonData, as: UTF8.self)
然后,创建实际参数和标头值:
let parameters = ["format": "json", "body": jsonString]
let token = "token"
let headers: HTTPHeaders = [.authorization(bearerToken: token), .contentType("text/json")]
let url = URL(string: "https://api.ecobee.com/1/thermostat")!
并提出要求:
AF.request(url, parameters: parameters, headers: headers).responseJSON { response in ... }