あなたの習慣について教えてください!!

RubyでWEBAPIをたたこうとおもい
リファレンスから
require 'net/http'
Net::HTTP.version_1_2 # おまじない
Net::HTTP.start('www.example.com', 80) {|http|
response = http.get('/index.html')
puts response.body
}

という記述を利用してヤフーのページを取得しようと
動かしたところまったく動作しなかったのでだめもとで例外をとってみたら

begin
Net::HTTP.version_1_2() # おまじない

Net::HTTP.start("http://yahoo.co.jp", 80) {|http|
response = http.get("/index.html");
puts response.body
}
rescue => ex
print ex.class;
print "<hr />";
print ex.message;
print "<hr />";
print ex.backtrace;
end

SocketErrorgetaddrinfo: 記憶域制御ブロックが壊れています。 C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `initialize'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `open'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/timeout.rb:53:in `timeout'C:/ruby/lib/ruby/1.8/timeout.rb:101:in `timeout'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:560:in `connect'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:553:in `do_start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:542:in `start'C:/ruby/lib/ruby/1.8/Net/HTTP.rb:440:in `start'C:/Apache/htdocs/tokui12.rb:11

上記のような例外が取れました。
これは、Rubyの際インストールが必要なのでしょうか?
リファレンスまんまを利用しているので記述間違いとかはないと思うのですが・・・

システム的な問題?と思いPHPでたたいたところ
PHPであれば普通にAPIはたたけました。

対処策はどうしたらいいのでしょうか?

A 回答 (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=2f …

<おまけ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っぽい物に合わせるようにしましょう。

規約として有名な所では青木さんや前田さんの物がありますが、
取り敢えずマニュアルで使われているスタイルを参考にしてみてください。
今後マニュアルを読む上でも、標準的なスタイルには慣れておいた方が良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます!
なんとかページ取得のができました。
いろいろためいして遊んで見ます。


>他の言語経験から、メソッド呼び出しに()を加えたり、行末に;を付けたりされていると思います。
そうなんです、ついつい癖で;とか()とか書いてしまいます。
個人的にも()や;を書かなくていいのはラクなのですこしずつ ならしていきます。

お礼日時:2011/09/04 16:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!