3

私はRubyが初めてで、Pythonのバックグラウンドから、URLにヘッドリクエストを送信し、ファイルがサーバーに存在するかどうか、タイムスタンプ、etagなどの情報を確認したいのですが、これを行うことができませんルビー。

Python の場合:

import httplib2
print httplib2.Http().request('url.com/file.xml','HEAD')

Rubyの場合:これを試してみたところ、エラーが発生しました

require 'net/http'

Net::HTTP.start('url.com'){|http|
   response = http.head('/file.xml')
}
puts response


SocketError: getaddrinfo: nodename nor servname provided, or not known
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in `initialize'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in `open'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:877:in `block in connect'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/timeout.rb:51:in `timeout'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:876:in `connect'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:861:in `do_start'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:850:in `start'
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/lib/ruby/2.0.0/net/http.rb:582:in `start'
    from (irb):2
    from /Users/comcast/.rvm/rubies/ruby-2.0.0-p0/bin/irb:16:in `<main>'
4

3 に答える 3

7

私はこれが答えられたことに気づきましたが、私もいくつかのフープを経験しなければなりませんでした. より具体的なものを次に示します。

#!/usr/bin/env ruby

require 'net/http'
require 'net/https' # for openssl

uri = URI('http://stackoverflow.com')
path = '/questions/16325918/making-head-request-in-ruby'

response=nil
http = Net::HTTP.new(uri.host, uri.port)
# http.use_ssl = true                            # if using SSL
# http.verify_mode = OpenSSL::SSL::VERIFY_NONE   # for example, when using self-signed certs

response = http.head(path)
response.each { |key, value| puts key.ljust(40) + " : " + value }
于 2015-03-05T01:26:26.887 に答える
6

:start に文字列を渡すだけでは十分ではないと思います。ドキュメントでは、正しいアドレスには URI オブジェクトのホストとポートが必要なようです:

uri = URI('http://example.com/some_path?query=string')

Net::HTTP.start(uri.host, uri.port) do |http|
  request = Net::HTTP::Get.new uri

  response = http.request request # Net::HTTPResponse object
end

これを試すことができます:

require 'net/http'

url = URI('yoururl.com')

Net::HTTP.start(url.host, url.port){|http|
   response = http.head('/file.xml')
   puts response
}

私が気づいたことの 1 つ - あなたのputs responseニーズは、ブロックの中にある! それ以外の場合、変数responseはスコープ内にありません。

編集: ヘッダーの値を取得するために、応答をハッシュとして扱うこともできます。

response.each_value { |value| puts value }
于 2013-05-01T20:41:14.570 に答える
3
headers = nil

url = URI('http://my-bucket.amazonaws.com/filename.mp4')

Net::HTTP.start(url.host, url.port) do |http|
  headers = http.head(url.path).to_hash
end

そして今、あなたはヘッダーのハッシュを持っていますheaders

于 2016-02-27T18:34:40.550 に答える