#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)
}