Time to Read
30秒
Time to Write
30秒
使い方
(ry
1 | p wbs_request(:GET, 'http://blog.udzura.jp/', :s => 'Ruby') |
1 | p wbs_request(:POST, 'http://www.google.com/', :q => 'Ruby') |
コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | require 'net/http' def wbs_request(method, uri_string, data={}) uri = URI.parse(uri_string) uri.path = "/" if uri.path.empty? http = Net::HTTP.new(uri.host) case method.to_s.downcase.to_sym when :get query_string = URI.encode(data.to_a.map{|(k, v)| "#{k}=#{v}"}.join("&")) return http.get(uri.path + "?" + query_string).body when :post return http.post(uri.path, data).body when :put, :delete, :head raise NotImplementedError, "Not yet supported" else raise ArgumentError, "Unsupported http method" end end |
感想
- Rubyコミュニティだと多分こんな記事書いても誰もブクマしない……どうすればいいんだ。
- あと、まともなRubyプログラマなら多分open-uriとか、ちょっと複雑ならhttpclientやHTTPartyなんかを使うと思った。
- 最初は
require 'open-uri'; open(...)とやろうとしたがPOSTができなかった。 - 今は反省している。
- ちなみに、Rubyに関数はなくて、関数のように使えるメソッドがあるだけです。
- 僕はPHP嫌いじゃないですよ。こういう記事を書くぐらいには好き。
see also
追記:QUERY-STRINGをURLエンコードしました
会社の先輩から指摘があったんですが、関数()の8行目が
8 | query_string = data.to_a.map{|(k, v)| "#{k}=#{v}"}.join("&") |
となっており、いわゆるURLエンコードがされていませんでした。お詫びして修正致します。というか、下手に車輪の再発明をするとこういうつまらないミスをしますよ、と言う教訓ですn(ry
追記:Curbを使ったら簡単にはならなかったけど多機能になりました
Curbという、libcurlのRubyバインディングがあるのは知っていました。一応使ってみました。
1 2 | sudo aptitude install libcurl4-openssl-dev sudo gem install curb |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | require 'rubygems' require 'curb' def wbs_request(method, uri_string, data={}) query_string = URI.encode(data.to_a.map{|(k, v)| "#{k}=#{v}"}.join("&")) case meth = method.to_s.downcase.to_sym when :head return Curl::Easy.send("http_#{meth}", uri_string + "?" + query_string).header_str when :get, :delete return Curl::Easy.send("http_#{meth}", uri_string + "?" + query_string).body_str when :post, :put return Curl::Easy.send("http_#{meth}", uri_string, query_string).body_str else raise ArgumentError, "Unsupported http method" end end |
行数はあまり変わりませんが、put、delete、headなどにも簡単に対応出来たので対応しました。良かったですね。これならRESTful APIのテストにも使えますね。
Curbはlibcurlの機能(Basic認証とか)が使えるみたいなので、むしろ複雑なことをする方が向いているようです。




