我尝试通过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'
答案 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
。
不知道为什么,但我也看到了相同的。