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認証とか)が使えるみたいなので、むしろ複雑なことをする方が向いているようです。