【问题标题】:Alamofire syntax for ecobee request用于 ecobee 请求的 Alamofire 语法
【发布时间】:2019-05-01 18:04:50
【问题描述】:

我正在尝试找到使用 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,并显示消息“由于通信错误,更新失败。”

在我浪费一天时间试图破解它之前,谁能帮我弄清楚我做错了什么?

【问题讨论】:

标签: swift alamofire ecobee-api


【解决方案1】:

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

【讨论】:

  • 谢谢,效果很好。现在我试图退后一步,使用 URLSession 处理这个请求,但我遗漏了一些东西。我将此作为新问题发布here
猜你喜欢
  • 2019-09-21
  • 2021-10-11
  • 1970-01-01
  • 2019-06-27
  • 2017-05-11
  • 1970-01-01
  • 2015-07-26
  • 1970-01-01
相关资源
最近更新 更多