request_head with basic_auth

时间:2014-11-19 13:50:44

标签: ruby http-headers

我想知道响应代码而不获取整个页面内容,因此我使用#request_head。但我得到了#34; 401",所以我需要传递登录名/密码:

require "net/http"

uri = URI.parse "http://example.com/some_path"

connection = Net::HTTP.new(uri.host, 80)

connection.basic_auth "qwe", "rty"

p connection.request_head uri.path

但我得到

  

temp.rb:9:在<main>': undefined method basic_auth&#39;对于#&lt; Net :: HTTP staging.new.inmyroom.ru:80

因为#basic_auth属于另一个类:

connection = Net::HTTP::Get.new uri.host

没有#request_head

  

temp.rb:10:在<main>': undefined method request_head&#39; for#&lt; Net :: HTTP :: Get GET&gt; (NoMethodError)

2 个答案:

答案 0 :(得分:1)

您可以使用HEAD HTTP动词。

来自RFC2616:

  

该方法(HEAD)可用于获得关于请求所暗示的实体的元信息&gt;没有转移实体 - 身体本身。此方法通常用于测试超文本链接的有效性,可访问性和最近的修改。

类似的东西:

require "net/http"

uri = URI('YOUR_URL')

req = Net::HTTP::Head.new(uri)
req.basic_auth('USERNAME', 'PASSWORD')

res = Net::HTTP.start(uri.hostname, uri.port) do |http|
  http.request(req)
end

res包含#<Net::HTTPOK 200 OK readbody=true>个对象。

答案 1 :(得分:0)

我设法将Get的标头传递给#request_head,但其标题哈希值应该展平:

get = Net::HTTP::Get.new url

get.basic_auth "qwe", "rty"

fixed_header = Hash[ get.to_hash.map{ |k,v| [k,v[0]] } ]

Net::HTTP.start(uri.hostname, uri.port) do |http|
  p http.request_head(uri.path, fixed_header)
end