読者です 読者をやめる 読者になる 読者になる

ここにタイトルが入ります

デザイン&プログラミングのことも書くし、それ以外のことも書く。

【ruby】net/httpでPOSTリクエスト(https)投げてみる。

ruby

個人で何かWebアプリ実装してみる、という時に何かのwebapiを利用することが最近多いです。

rubyapiにhttpリクエストを投げるには、getの場合だとopen-uriを使うことが多いのですが
postなど投げるときはnet/httpを使っています。

最近https(ssl)通信でリクエストを投げるというのを実装したので
忘れないようにメモ。


postメソッドリクエスト例


以下はgithub apiにリクエスト投げた時の例。
リポジトリにフックメソッドを追加するというリクエストです。

設定内容をjsonで渡す必要があったので、bodyにjsonデータをセットしています。
(ちなみにto_jsonメソッドActiveRecord::Baseのメソッドですね確か)

uri = URI.parse("https://api.github.com/repos/#{user_name}/#{repo_name}/hooks?access_token=#{user_authentication_token}")

response = nil

request = Net::HTTP::Post.new(uri.request_uri, initheader = {'Content-Type' =>'application/json'})
request.body = {name: "web", config: {url: "hogehogehogehoge"}}.to_json

http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

http.set_debug_output $stderr

http.start do |h|
  response = h.request(request)
end


で、ポイントが2つほど。


opensslでhttps通信する場合

この指定が必要になります(詳しいことは知らん(・・))
証明書を使わない場合は

http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE

※追記
verify_modeがNONEなのは証明書を使わないってことらしい。
証明書を使う場合はOpenSSL::SSL::VERIFY::PEERを指定して、
http.ca_fileにca証明書のパスを渡してあげる。

リクエストの中身を出力する

リクエスト投げたのに期待する値が帰ってこない…!という場合、
実際正しいリクエストが投げられているのかどうか確認したいですよね。

http.set_debug_output $stderr

こう書いておくことで、標準エラー出力にリクエスト内容をはいてくれます。
もちろん出力先は$stderrでなくても大丈夫です(たぶん)。

これ意外と見つからなかったのですが開発中は超重要だと思います。