- ベストアンサー
Rubyのnet/httpライブラリでWEBAPIをたたく際に発生するSocketErrorgetaddrinfo例外の対処方法
- Rubyのnet/httpライブラリを使用してWEBAPIをたたく際にSocketErrorgetaddrinfo例外が発生しました。このエラーは通常、ネットワーク接続に関連しています。対処方法としては、以下のような対応が考えられます。まず、インターネット接続が正常かどうかを確認しましょう。次に、正しいURLを指定しているかを確認し、ドメイン名が正しいかどうかも確認しましょう。また、ファイアウォールやプロキシサーバーなどの設定も確認してください。さらに、DNSの設定やホストファイルの設定を確認し、必要に応じて修正してみてください。最後に、他のネットワーク接続を試してみることも検討しましょう。
- 例外の発生原因は通常、ネットワーク接続に問題があることが考えられます。具体的には、インターネット接続が不安定な場合や、指定したURLが存在しない場合などが挙げられます。また、ファイアウォールやプロキシサーバーなどの設定により、通信がブロックされることもあります。さらに、DNSの設定やホストファイルの設定に問題がある場合も、このようなエラーが発生する可能性があります。
- 対処方法としては、まず最初にインターネット接続が正常かどうかを確認しましょう。次に、正しいURLを指定しているかを確認し、ドメイン名が正しく記述されているかどうかも確認してください。また、ファイアウォールやプロキシサーバーなどの設定が正しく行われているかも確認してください。さらに、DNSの設定やホストファイルの設定を確認し、必要に応じて修正してみてください。もし他のネットワーク接続が正常に動作する場合は、そのAPIが使用しているポートがブロックされている可能性も考えられるので、ネットワーク管理者に相談してみることも検討しましょう。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
たぶん、この例外発生原因は次の部分です。 Net::HTTP.start("http://yahoo.co.jp", 80) {|http| URIではなくアドレス(IPアドレスやFQDN等)を入れる場所なので、こんな感じですね Net::HTTP.start('www.yahoo.co.jp', 80) {|http| <おまけ1> まず、参照するドキュメントを変えましょう。 記載されたマニュアルは既に古い物なので、Ruby1.8.7系であっても次のマニュアルを当たるようにしましょう。 http://doc.ruby-lang.org/ja/1.8.7/doc/index.html http://doc.ruby-lang.org/ja/1.8.7/library/net=2fhttp.html <おまけ2> ヤフーのトップページはリダイレクトかかるので、多分今回のサンプルそのまんまだと意図した実験にはならないでしょう。 別のサイトで試すか、マニュアルにも記載のあるリダイレクト対応メソッドを実装しましょう。 以下、枠線内抜粋 -------------------------------------------------------------------------------------------------- リダイレクトに対応する 以下の例の fetch はリダイレクトに対応しています。 limit 回数以上リダイレクトしたらエラーにします。 require 'net/http' require 'uri' def fetch(uri_str, limit = 10) # You should choose better exception. raise ArgumentError, 'HTTP redirect too deep' if limit == 0 response = Net::HTTP.get_response(URI.parse(uri_str)) case response when Net::HTTPSuccess response when Net::HTTPRedirection fetch(response['location'], limit - 1) else response.value end end print fetch('http://www.example.org') -------------------------------------------------------------------------------------------------- このサンプルコードから、最終行を次の内容に変えてみてください 尚、この例だとuriライブラリを読み込んでいるため、ターゲット指定にURIが使えるようになっています。 print fetch('http://www.yahoo.co.jp').body 順を追う意味からはあまり適さないと思うので、別のサイトで試したほうがいいとは思います。 <おまけ3> 他の言語経験から、メソッド呼び出しに()を加えたり、行末に;を付けたりされていると思います。 特別に強いこだわりが無ければ、この辺のコーディングスタイルをRubyっぽい物に合わせるようにしましょう。 規約として有名な所では青木さんや前田さんの物がありますが、 取り敢えずマニュアルで使われているスタイルを参考にしてみてください。 今後マニュアルを読む上でも、標準的なスタイルには慣れておいた方が良いと思います。
お礼
ありがとうございます! なんとかページ取得のができました。 いろいろためいして遊んで見ます。 >他の言語経験から、メソッド呼び出しに()を加えたり、行末に;を付けたりされていると思います。 そうなんです、ついつい癖で;とか()とか書いてしまいます。 個人的にも()や;を書かなくていいのはラクなのですこしずつ ならしていきます。