Запрос API не работает с rest-client, но работает с Faraday / cURL - PullRequest
0 голосов
/ 08 июня 2018

У меня есть запрос GET, чтобы запросить JOOR API для получения списка их категорий продуктов.

Этот запрос прекрасно работает с гемами cURL или Faraday, но плохо работает с гемом rest-client.Результаты запроса на тестирование приведены ниже:

1) С cURL

curl -X GET \
  https://apisandbox.jooraccess.com/v2/categories/ \
  -H 'Authorization: Bearer [mytoken]' \
  -H 'Content-Type: application/json'

2) С Фарадеем

conn = Faraday.new(url: 'https://apisandbox.jooraccess.com/v2/categories')
conn.get do |req|
  req.headers['Content-Type'] = 'application/json'
  req.headers['Authorization'] = 'Oauth2 [mytoken]'
end

3) С клиентом отдыха

response = ::RestClient::Request.execute(method: :get, url: 'https://apisandbox.jooraccess.com/v2/categories', headers: {'Content-Type': 'application/json', 'Authorization': 'Oauth2 [mytoken]'})

1) и 2) оба получили ожидаемый ответ со списком категорий, но 3) получили ответ с жалобой «Формат запроса / ответа не поддерживается»

Так в чем разница между 3)и 1) / 2)?Почему только 3) происходит сбой?

========== ОБНОВЛЕНИЕ ==========

Использовал гем httplog для записи информации заголовка для обоихФарадейский и Rest-клиент запросы.Вот журнал.

Фарадей:

[httplog] Connecting: apisandbox.jooraccess.com:443
[httplog] Sending: GET http://apisandbox.jooraccess.com:443/v2/categories
[httplog] Header: user-agent: Faraday v0.9.2
[httplog] Header: content-type: application/json
[httplog] Header: authorization: Oauth2 [mytoken]
[httplog] Header: accept-encoding: gzip;q=1.0,deflate;q=0.6,identity;q=0.3
[httplog] Header: accept: */*
[httplog] Header: connection: close
[httplog] Data:
[httplog] Status: 200
[httplog] Benchmark: 0.2766950000077486 seconds
[httplog] Header: content-type: application/json
[httplog] Header: date: Fri, 08 Jun 2018 05:56:16 GMT
[httplog] Header: server: nginx
[httplog] Header: server-time: 2018-06-08T05:56:16+00:00+00:00
[httplog] Header: vary: Cookie
[httplog] Header: content-length: 6958
[httplog] Header: connection: Close
[httplog] Response:
{
    "categories_list": {
        "response": {
            "code": "0",
            "comment": "",
...

Rest-Client:

[httplog] Connecting: apisandbox.jooraccess.com:443
[httplog] Sending: GET http://apisandbox.jooraccess.com:443/v2/categories
[httplog] Header: accept: */*; q=0.5, application/xml
[httplog] Header: accept-encoding: gzip, deflate
[httplog] Header: content-type: application/json
[httplog] Header: authorization: Oauth2 [mytoken]
[httplog] Header: user-agent: Ruby
[httplog] Data:
[httplog] Status: 200
[httplog] Benchmark: 0.25124399999913294 seconds
[httplog] Header: content-type: application/xml
[httplog] Header: date: Fri, 08 Jun 2018 06:05:31 GMT
[httplog] Header: server: nginx
[httplog] Header: server-time: 2018-06-08T06:05:31+00:00+00:00
[httplog] Header: vary: Cookie
[httplog] Header: content-length: 202
[httplog] Header: connection: keep-alive
[httplog] Response:
<?xml version="1.0" encoding="UTF-8"?>
<response>
    <code>8</code>
    <comment>Request/Response format is not supported</comment>
    <log_id>9950b3b7-0e92-4514-9d2b-29d4b006fdc8</log_id>
</response>

Это показывает, что Content-Type в заголовке, вероятно, не прошел правильно послеобработка отдыхающим клиентом.Поэтому способ использования rest-client может быть неправильным.Как мне это исправить?

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Я должен добавить accept: '*/*' в заголовок для запроса rest-client.И это работает.

0 голосов
/ 08 июня 2018

Попробуйте изменить это на свой код rest-client

response = ::RestClient::Request.execute(method: :get, url: 'https://apisandbox.jooraccess.com/v2/categories', headers: {'Content-Type': 'application/json', 'Accept': 'application/json', 'Authorization': 'Oauth2 [mytoken]'})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...