Форматирование HTTP-запроса с помощью Alamofire "format = json & body =" - PullRequest
0 голосов
/ 12 марта 2019

Я пытаюсь отправить запрос API, который должен выглядеть следующим образом:

https://api.gibbly.com/1/device?format=json&body={"selection"={"selectionType":"registered","selectionMatch":"","includeRuntime":true}}

Однако, когда я использую код ниже, я получаю сообщение об ошибке. В сегменте [RESULT] ответа я получаю следующее:

[RESULT] FAILURE: responseSerializationFailed(reason: Alamofire.AFError.ResponseSerializationFailureReason.jsonSerializationFailed(error: Error Domain=NSCocoaErrorDomain Code=3840 "Invalid value around character 0." UserInfo={NSDebugDescription=Invalid value around character 0.}))

Я попробовал запрос с помощью Postman, и он отлично работает, поэтому я думаю, что проблема вызвана кодом.

Основываясь на первом утверждении «print» в коде, тело HTTP выглядит корректно:

Optional({"selection":{"selectionType":"registered","selectionMatch":"","includeSettings":true}})

Единственное, о чем я могу думать, это то, что Alamofire не добавляет "format = json & body =" в запрос, но я не могу понять, как это понять. Любая помощь будет оценена.


        let headers: HTTPHeaders = [
            "Authorization": "Bearer adsf023494axadf32342",
            "Content-Type": "text/json"
        ]

        let parameters: [String: Any] = [
            "selection":[
                "selectionType":"registered",
                "selectionMatch":"",
                "includeSettings":true
            ]
        ]

        Alamofire.request(url!, method: .get, parameters: parameters, encoding: JSONEncoding.default, headers: headers).responseJSON {
            response in
print(NSString(data: (response.request?.httpBody)!, encoding: String.Encoding.utf8.rawValue))
            print(response)
        }

Ответы [ 2 ]

0 голосов
/ 15 марта 2019

Хорошо, разобрался.Я сделал следующее: (1) создал параметры в виде строки, (2) процентов закодировал их, чтобы все символы можно было использовать в качестве URL, (3) добавил закодированные параметры в базовый URL, и (4) использовалновый URL с базовым URL, а затем закодированные параметры в качестве URL для моего запроса.

let url = "https://api.gibbly.com/1/device?format=json&body="
        let urlParams = "{\"selection\":{\"selectionType\":\"registered\",\"selectionMatch\":\"\",\"includeSettings\":true}}"
        let urlEncoded = url + urlParams.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed)!

        let headerList : HTTPHeaders = [
            "Authorization" : "Bearer " + (KeychainWrapper.standard.string(forKey: "accessToken"))!, 
            "Content-Type" : "text/json"
        ]

        Alamofire.request(urlEncoded, method: .get, headers: headerList).responseJSON{
            response in
print(response)
}
0 голосов
/ 12 марта 2019

Для метода GET используйте URLEncoding.default вместо JSONEncoding.default в запросе Alamofire

...