2015年10月23日金曜日

Ruby Net::HTTPの使い方と(直接)使うべきでない時

Untitled Document.md

rubyで単純なHTTP Getをするのであれば、openuriが圧倒的に便利ファイルと同じように、http getリクエストを扱えてしまう。
しかし、比較的複雑なリクエスト(例:POST、ヘッダに何か入れる)の場合、net/httpを使う。

最も単純なGET

Net::HTTPでのgetは以下のようになる。 この程度ならopenuriを使った方が良い。

require "net/http"

# レスポンスをブロックの外で使いたい時には事前に定義しておこう
# ブロックがクロージャであることを忘れずに
response=nil

uri = URI.parse("http://example.net/")
Net::HTTP.start(uri.host, uri.port) do |http|
  response = http.get("/index.html")
  puts response.code # ステータスコード
  puts response.message # メッセージ
  puts response.body # レスポンスボディ
end

puts response.message # => OK

以下のようにインスタンスを作成してからコネクションを開く事もできる。
しかしこの場合には、最後にクローズしないとだめ。忘れるとシツレイ。
startにブロックを渡せば、ファイルオープンと同じように最後にクローズを勝手にやってくれるので安心。

http = Net::HTTP.new(uri.host, uri.port)
request = Net::HTTP::Get.new("/index.html")
http.close

HTTPSへのGET

以下のようにstartの引数に:use_ssl=>trueを渡してやる。

require "net/http"

uri = URI.parse("https://example.net/")
Net::HTTP.start(uri.host, uri.port,:use_ssl=>true) do |http|
  response = http.get("/index.html")
  puts response.body
end

POSTの場合

require "net/http"

uri = URI.parse("http://example.net/")
Net::HTTP.start(uri.host, uri.port) do |http|
  response = http.post("/search.cgi",'query=foo',header=nil)
  puts response.code
  puts response.message
  puts response.body
end

素晴らしいNet::HTTP解説のリンク

チートシート
http://www.rubyinside.com/nethttp-cheat-sheet-2940.html

RestでJSONリクエストを投げる例。
https://www.socialtext.net/open/very_simple_rest_in_ruby_part_3_post_to_create_a_new_workspace
http://altarf.net/computer/ruby/2890

restを作る時に便利なgem
https://github.com/rest-client/rest-client

以下に該当する場合にはNet::HTTPを使うべきでない。

単純なGETしかしない

→openuriを使う
http://ruby-doc.org/stdlib-2.1.0/libdoc/open-uri/rdoc/OpenURI.html

クローラーを作りたい

→anemoneを使う
https://github.com/chriskite/anemone

Amazonの商品検索、操作APIを使いたい

→asinを使う
https://github.com/phoet/asin

AWSのRESTを使いたい

→aws-sdk-rubyを使う
https://github.com/aws/aws-sdk-ruby

なんかRESTを使いたい。

→rest-clientを使う
https://github.com/rest-client/rest-client

0 件のコメント:

コメントを投稿