Синтаксис Alamofire для запроса экоби - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь найти правильный синтаксис для вызова API ecobee из Swift 4 с использованием Alamofire.

Их пример 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 с сообщением «Обновление не удалось из-за ошибки связи».

Может ли кто-нибудь помочь мне выяснить, что я делаю неправильно, прежде чем тратить еще один день, пытаясь взломать мой путь через это?

1 Ответ

0 голосов
/ 01 мая 2019

Формат запроса 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 ... }
...