Форматирование HTTP-запроса с помощью Alamofire «format=json

#swift #httprequest #alamofire

#swift #httprequest #alamofire

Вопрос:

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

https://api.gibbly.com/1/device ?format=jsonamp;body={«selection»={«SelectionType»: «зарегистрированный», «selectionMatch»:»»,»includeRuntime»: true}}

Однако, когда я использую приведенный ниже код, я получаю сообщение об ошибке. В сегменте [РЕЗУЛЬТАТ] ответа я получаю следующее:

 [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 amp; 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)
        }
  

Комментарии:

1. Вы уверены, что это формат API? Похоже, что вы отправляете данные, которые должны быть в теле HTTP, как часть строки запроса

2. Попробуйте использовать content-type application/json , если вы отправляете параметры в GET-запросе, если не используете URLEncoding.default в качестве кодировки.

Ответ №1:

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

Комментарии:

1. Спасибо. Я попробовал это и получил ошибку сериализации. Есть еще мысли? УСПЕХ: { статус = { код = 4; сообщение = «Ошибка сериализации. Запрос не содержит тела. Убедитесь, что предоставлено тело и правильно указан тип содержимого POST.»; }; }

2. это потому, что в respsnse вы пытаетесь напечатать тело запроса следующим образом, print(NSString(data: (response.request? .httpBody)!, кодировка: Строка. Кодировка.utf8.rawValue )) Но в вашем запросе нет тела запроса, поскольку это запрос GET

Ответ №2:

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

 let url = "https://api.gibbly.com/1/device?format=jsonamp;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)
}