Чем отличается Net::HTTP от выполнения curl в ruby?

У меня есть методы, которые получают ресурс с внешнего сервера Rails через JSON. Один использует net/http библиотека, другой выполняет curl, Они отвечают по-разному.

Если я использую net/http

def get_via_nethttp(endpoint, user, password, id)
  uri = URI.parse("#{endpoint}/items/#{id}.json")
  http = Net::HTTP.new(uri.host, uri.port)
  headers = {
    'Content-Type' => 'application/json',
    'Accept-Encoding' => 'gzip,deflate',
    'Accept' => 'application/json'
  }
  request = Net::HTTP::Get.new(uri.request_uri, headers)
  request.basic_auth(user, password)

  http.request(request)
end

тогда код возврата кодируется ASCII-8Bit. Вот фрагмент:

\x1F\x8B\b\x00\x00\x00\x00\x00\x00\x03\xBDWmo\xE28\x10\xFE+Vv\xA5...

Однако, если я использую curl

def get_via_curl(endpoint, user, password, id)
  %x(curl -u #{user}:#{password} #{endpoint}/items/#{id}.json)
end

затем возвращается строка JSON

"{\"id\":1234,\"title\":\"Foo\"}"

Я пробовал множество способов декодировать вывод net/http но безрезультатно. В конце концов, я просто хочу строку JSON, поэтому я закончил с curl, Какая разница, что вызывает это?

1 ответ

Решение

Установка в заголовках 'Accept-Encoding' => 'gzip,deflate' может привести к отправке сервером чанкованного ответа. Просто удали это.

Другие вопросы по тегам