Phoenix/Elixir - cURL работает, но HTTPoison не работает
В моем приложении Phoenix я пытаюсь использовать HTTP-клиент HTTPoison ( https://hexdocs.pm/httpoison/api-reference.html) для отправки запроса к API AgileCRM. Мне удалось использовать cURL для успешного выполнения запроса, но моя попытка воспроизвести его в Фениксе не удалась с 401 UNAUTHORIZED
ошибка.
Мой успешный CURL:
$ curl https://domain.agilecrm.com/dev/api/contacts/search/email \
-H "Accept: application/json" \
-d 'email_ids=["contact@test.com"]' \
-u admin@test.com:api_key
который возвращает статус 200
и запрошенные данные.
Мой сбой HTTPoison:
url = "https://domain.agilecrm.com/dev/api/contacts/search/email"
body = Poison.encode!(%{"body": "email_ids=['contact@test.com']"})
headers = [{"Accept", "application/json"}, {"Authorization", "admin@test.com:api_key"}]
response = HTTPoison.post!(url, body, headers)
IO.inspect response
который возвращается
%HTTPoison.Response{body: "<html><head>\n<meta http-equiv=\"content-type\" content=\"text/html;charset=utf-8\">\n<title>401 UNAUTHORIZED</title>\n</head>\n<body text=#000000 bgcolor=#ffffff>\n<h1>Error: UNAUTHORIZED</h1>\n</body></html>\n",
headers: [{"X-TraceUrl", "/appstats/details?time=1509129565372&type=json"},
{"WWW-Authenticate", "Basic realm=\"agilecrm\""},
{"Content-Type", "text/html; charset=utf-8"},
{"X-Cloud-Trace-Context", "8de994n2tbu2o356891bc3e6"},
{"Date", "Fri, 27 Oct 2017 18:39:25 GMT"}, {"Server", "Google Frontend"},
{"Content-Length", "200"}],
request_url: "https://domain.agilecrm.com/dev/api/contacts/search/email", status_code: 401}
Из сообщения я предполагаю (возможно, неправильно), что проблема связана с данными авторизации. Насколько я понимаю, что -u
Флаг в CURL является эквивалентом добавления Authorization
заголовок, а может и нет?
HTTPoison также позволяет options
параметр, и один из параметров (ха!) является ":proxy_auth - проверка подлинности прокси {пользователь, пароль} кортеж", но передача [proxy_auth: {"admin@test.com", "api_key"}]
дает тот же результат.
Любые мысли по этому поводу будет высоко ценится
2 ответа
Эквивалент curl -u
это basic_auth
вариантhackney
не HTTPoison's proxy_auth
, Вы можете использовать это так:
HTTPoison.post!(url, body, headers, hackney: [basic_auth: {"admin@test.com", "api_key"}])
На самом деле curl -u
больше, проверьте этот ответ: что на самом деле делает флаг -u на cURL?,
Он кодирует ваш пользователь: пароль в строку базы 64 и добавляет Basic
префикс.
Вы должны отправить заголовок, как это
Authorization: Basic base64 encoded string