Чем отличается 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'
может привести к отправке сервером чанкованного ответа. Просто удали это.