Ruby http获取返回截断的响应

时间:2015-09-17 05:07:04

标签: http http-get postman

我尝试通过Postman将HTTP Get发送到设备的Restful API,它可以正常返回我期待的所有文本。 Postman建议请求的Ruby代码如下:

url = URI('http://192.168.1.5/rest/op/BD1FD3D893613E79')
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request.basic_auth 'admin', 'admin'
request["accept"] = 'Application/json'
response = http.request(request)
puts response.read_body

但是当我在我的代码中尝试它时,它返回一个截断的响应(缺少行),我必须多次重新发送相同的Get以获得整个文本响应响应。

上面的Ruby代码中是否缺少导致此截断响应的内容?

更新1

我试过这个

url = URI('http://192.168.1.5/rest/op/BD1FD3D893613E79')
http = Net::HTTP.new(url.host, url.port)
request = Net::HTTP::Get.new(url)
request.basic_auth 'admin', 'admin'
request["accept"] = 'Application/json'
response = http.request(request)
puts response.read_body
response.read_body do |segment|
   puts segment.to_s
end

并且生成了此错误

IOError (Net::HTTPOK#read_body called twice):

更新2

我试过这个

1073 url = URI('http://192.168.1.5/rest/op/BD1FD3D893613E79')
1074 http = Net::HTTP.new(url.host, url.port)
1075 request = Net::HTTP::Get.new(url.to_s)
1076 request.basic_auth 'admin', 'admin'
1077 request["accept"] = 'Application/json'
1078 response = http.request(request)
1079 response.read_body do |segment|
1080   puts segment.to_s
1081 end

并收到此错误

IOError (Net::HTTPOK#read_body called twice):
  app/controllers/Apps_controller.rb:1079:in `block in get_config'
  app/controllers/Apps_controller.rb:1045:in `each'
  app/controllers/Apps_controller.rb:1045:in `get_config'

4 个答案:

答案 0 :(得分:0)

基于:http://ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTPResponse.html#method-i-read_body

read_body将身体作为流返回,因此您应该迭代它,例如:

response.read_body do |segment|
  puts segment
end

如果您想使用全身,请使用:response.body

答案 1 :(得分:0)

看起来非常相似......

从Bamboo服务器提取一组工件(zip文件)并写入本地存储时,我们会收到截断响应。它只是在8个服务器中的一个上发生不一致,并不总是相同的文件。似乎总是丢失文件的最后一部分。

使用Ruby 2.0.0p598和net / http。

zip文件的大小范围为2 mb到​​34 mb。

虽然我们还没有弄清楚响应正文被截断的原因,但我们的解决方法是将预期的内容长度(在响应标头中)与响应正文大小进行比较。如果他们不匹配,请再试一次。示例代码:

package = "packages/applicationname.zip"

def retrieve(package)

  # generates the Bamboo url for the given package
  sourceURL = package_url package

  expectedLength = 0
  bodyLength = 1

  #  Try to catch the bad download and re-issue the GET request,
  while expectedLength != bodyLength do

    # add a counter if worried about getting stuck

    # issue the request to get the current package zip file
    response = my_request_wrapper sourceURL

    expectedLength = response['content-length'].to_i
    theBody = response.body
    bodyLength = theBody.size

    if expectedLength != bodyLength then
        puts "!!  SIZE MISMATCH   !!"
    else
        # the response body is good, process as needed
        open package, 'wb' do |io|
          io.write theBody
        end
    end
  end
end

def my_request_wrapper(url)
  uri = URI.parse(url)
  http = Net::HTTP.new(uri.host, uri.port)
  http.use_ssl = true
  http.verify_mode = OpenSSL::SSL::VERIFY_NONE
  req = Net::HTTP::Get.new(uri.request_uri)
  req.basic_auth("user", "pwd")
  return http.request req
end

答案 2 :(得分:0)

我使用的是OSX Sierra,rvm和ruby 2.3.0

更新我的rvm,ruby和gems似乎已经解决了我的问题

答案 3 :(得分:0)

我认为在致电http.start之前,您必须致电http.request。 不知道为什么,但我也看到了相同的。