4

リモートエラーがない限り、現在のコードは機能します。

def get_name_from_remote_url
      cstr = "http://someurl.com"
      getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read
      doc = Nokogiri::XML(getresult)
      my_data = doc.xpath("/session/name").text
      #  => 'Fred' or 'Sam' etc
      return my_data
end

しかし、リモートURLがタイムアウトしたり、何も返さなかったりした場合はどうなりますか?たとえば、それを検出してnilを返すにはどうすればよいですか?

そして、Open-URIは、あきらめるまでの待機時間を定義する方法を提供しますか?このメソッドは、ユーザーが応答を待っている間に呼び出されるので、あきらめて「アクセスしようとしたリモートサーバーが現在利用できません」とユーザーに伝える前に、最大タイムアウト時間を設定するにはどうすればよいですか。

4

1 に答える 1

9

Open-URIは便利ですが、その使いやすさは、Net::HTTPなどの他のHTTPクライアントが許可する多くの構成の詳細へのアクセスを削除することを意味します。

使用しているRubyのバージョンによって異なります。1.8.7の場合、タイムアウトモジュールを使用できます。ドキュメントから:

require 'timeout'
begin
status = Timeout::timeout(5) {
  getresult = open(cstr, "UserAgent" => "Ruby-OpenURI").read
}
rescue Timeout::Error => e
  puts e.to_s
end

次に、getresultの長さをチェックして、コンテンツを取得したかどうかを確認します。

if (getresult.empty?)
  puts "got nothing from url"
end

Ruby 1.9.2を使用している場合は、メソッドに:read_timeout => 10オプションを追加できます。open()


また、コードを強化して、もう少し柔軟にすることもできます。これにより、URLを渡すか、現在使用されているURLにデフォルト設定することができます。また、NokogiriのNodeSetドキュメントを読んで、、、、、、、、違いを理解xpathしてください。/cssat%at_cssat_xpath

def get_name_from_remote_url(cstr = 'http://someurl.com')
  doc = Nokogiri::XML(open(cstr, 'UserAgent' => 'Ruby-OpenURI'))

  # xpath returns a nodeset which has to be iterated over
  # my_data = doc.xpath('/session/name').text #  => 'Fred' or 'Sam' etc  

  # at returns a single node
  doc.at('/session/name').text
end
于 2011-02-11T06:30:57.027 に答える