Давайте воспользуемся полезными инструментами отладки Alamofire, поскольку у вас есть cURL
образец.
Давайте разберем ваш текущий код:
let headers = ["Content-Type": "application/x-www-form-urlencoded"]
let params = ["grant_type": "client_credentials"]
let request = Alamofire.request("https://test.api.amadeus.com/v1/security/oauth2/token",
method: .post,
parameters: params,
encoding: JSONEncoding.default,
headers: headers).authenticate(user: "API", password: "API")
print(request.debugDescription)
request.responseJSON { response in
debugPrint(response)
let result = response.result.value
print(result)
}
Вывод:
$>curl -v \
-X POST \
-u API:API \
-H "Accept-Language: fr-US;q=1.0, en;q=0.9, fr-FR;q=0.8" \
-H "Accept-Encoding: gzip;q=1.0, compress;q=0.5" \
-H "User-Agent: iOSTest/1.0 (nt.iOSTest; build:1; iOS 12.2.0) Alamofire/4.8.1" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "{\"grant_type\":\"client_credentials\"}" \
"https://test.api.amadeus.com/v1/security/oauth2/token"
Пойдем по частям: нам следует забыть о заголовках Accept-Encoding, User-Agent и Accept-Language.Я пропущу их позже.
Мы видим, что -d
(данные в httpBody) неверны.
Давайте изменим это: encoding: JSONEncoding.default
на encoding: URLEncoding(destination: .httpBody)
.Плюс это имеет смысл, поскольку в типе контента, который мы сказали, он был закодирован в URL.
Мы получаем:
$>-d "grant_type=client_credentials"
Кажется лучше.
Мы видим -u API:API \
которые соответствуют .authenticate(user: "API", password: "API")
.Мы можем захотеть удалить его, если сервер не управляет такой аутентификацией, и вместо этого поместить его в параметры.Итак, давайте изменим параметры:
let params = ["grant_type": "client_credentials",
"client_id" : "APIKey",
"client_secret" : "APISecret"]
Получим:
$>-d "client_id=APIKey&client_secret=APISecret&grant_type=client_credentials" \
Это должно сработать.
Порядок не тот, но сервер не долженне волнует это.Это должен быть ключ / доступ, а не индекс / доступ.
Итак, окончательно:
let headers = ["Content-Type": "application/x-www-form-urlencoded"]
let params = ["grant_type": "client_credentials",
"client_id" : "APIKey",
"client_secret" : "APISecret"]
let request = Alamofire.request("https://test.api.amadeus.com/v1/security/oauth2/token",
method: .post,
parameters: params,
encoding: URLEncoding(destination: .httpBody),
headers: headers)
print(request.debugDescription)
request.responseJSON { response in
debugPrint(response)
let result = response.result.value
print(result)
}
Вывод (с пропущенными заголовками):
$ curl -v \
-X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "client_id=APIKey&client_secret=APISecret&grant_type=client_credentials" \
"https://test.api.amadeus.com/v1/security/oauth2/token"