gpt4 book ai didi

swift - ecobee 请求的 Alamofire 语法

转载 作者:行者123 更新时间:2023-11-30 10:44:54 25 4
gpt4 key购买 nike

我正在尝试找到使用 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)

然后,创建实际参数和 header 值:

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 ... }

关于swift - ecobee 请求的 Alamofire 语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55940599/

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