什么是Net :: HTTP与在ruby中执行curl不同?

时间:2013-12-19 23:57:19

标签: ruby curl net-http

我有通过JSON从外部Rails服务器获取资源的方法。一个使用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 个答案:

答案 0 :(得分:1)

标题'Accept-Encoding' => 'gzip,deflate'中的设置可能会导致服务器向您发送分块响应。只需删除它。