Как выполнить сообщение с Alamofire (swift), чтобы получить маркер безопасности в качестве возвращаемого значения - PullRequest
0 голосов
/ 22 мая 2019

Я хочу запросить токен через cURL, используя Swift Alamofire. Тем не менее, я не мог понять, как передать правильные параметры в правильном порядке, чтобы это работало.

Описание, данное Амадеем, следующее:

enter image description here

 let headers = [
    "Content-Type": "application/x-www-form-urlencoded"
]

let params = [
    "grant_type": "client_credentials"
]


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").responseJSON { response in debugPrint(response)

    let result = response.result.value
    print(result)
}

Ожидаемый результат - получить взамен файл JSON, включая токен для выполнения запросов API. Любая помощь высоко ценится. Спасибо

Ответы [ 3 ]

1 голос
/ 22 мая 2019

Давайте воспользуемся полезными инструментами отладки 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"
0 голосов
/ 22 мая 2019

Строка, которая должна быть передана как тело:

let params = [
    "grant_type=client_credentials&client_id=CLIENTIDHERE&client_secret=CLIENTSECRETHERE"
]

Я не знаю много о Swift, но я думаю, вы могли бы сделать:

let params = [
    "grant_type": "client_credentials"
    "client_id" : "Your API Key"
    "client_secret" : "Your API Secret"
]
0 голосов
/ 22 мая 2019

В документах сказано, что параметры должны включать grant_type:client_credentials&client_id={client_id}&client_secret={client_secret}.В ваших параметрах отсутствуют идентификатор клиента и секрет клиента.Обязательно включите их, выполнив что-то вроде этого:

let params = [
    "grant_type": "client_credentials&client_id=CLIENTIDHERE&client_secret=CLIENTSECRETHERE"
]
...