首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用于ecobee请求的Alamofire语法

用于ecobee请求的Alamofire语法
EN

Stack Overflow用户
提问于 2019-05-02 02:04:50
回答 1查看 84关注 0票数 0

我正在尝试找到使用Alamofire从Swift 4调用ecobee的API的正确语法。

他们的cURL示例:

代码语言:javascript
复制
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\}\}'

我最接近的解决方案是这样的

代码语言:javascript
复制
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,并显示消息“由于通信错误导致更新失败”。

有人能帮我找出我做错了什么吗?在我浪费一天时间尝试破解它之前?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-02 02:40:46

Ecobee的请求格式有点奇怪,因为它使用表单编码的参数,但其中一个值是JSON编码的正文。你需要做一些准备工作,因为Alamofire本身并不支持这样的东西。这只是示例代码,您需要做一些工作以使其更安全。

首先,对JSON参数进行编码,得到String的值:

代码语言:javascript
复制
let jsonParameters = ["selection": ["selectionType": "registered", "selectionMatch": ""]]
let jsonData = try! JSONEncoder().encode(jsonParameters)
let jsonString = String(decoding: jsonData, as: UTF8.self)

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

代码语言:javascript
复制
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")!

并发出以下请求:

代码语言:javascript
复制
AF.request(url, parameters: parameters, headers: headers).responseJSON { response in ... }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55940599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档