破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

RubyでHTTPリクエストを投げて返ってくるJSONをParseするとかいうよくあるやつ with Net::HTTP, open-uri

タイトル長えw

さて、HTTP リクエストするとJSON が返ってくるようなAPI でなんやかんや処理をすることが割りとよくあるのだが、すぐに忘れてしまうのでメモメモ。

https://api.example.com/smaple.json にHTTP GET リクエストを投げるとJSON が返ってくる場合を想定します。

Net::HTTP を使うとこんなふうに書ける。

require require 'net/http'
require 'uri'
require 'json'

uri = URI.parse('https://api.example.com/smaple.json')

https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true
res = https.start {
  https.get(uri.request_uri)
}

if res.code == '200'
  result = JSON.parse(res.body)
  # Railsだったらこう書ける`require 'json'`なしで
  # result = ActiveSupport::JSON.decode res.body

  # resultを使ってなんやかんや処理をする
else
  puts "OMG!! #{res.code} #{res.message}"
end

ただし、Ruby にはopen-uri と呼ばれるNet::HTTP やNet::HTTPS をより簡単に利用するためのラッパーがあり、それを使うともっとスッキリ書けます。

require 'open-uri'

res = open('https://api.example.com/smaple.json')
code, message = res.status # res.status => ["200", "OK"]

if code == '200'
  result = ActiveSupport::JSON.decode res.read
  # resultを使ってなんやかんや処理をする
else
  puts "OMG!! #{code} #{message}"
end

というふうに書けます。

wrapper を"ラッパー"とカタカナで書くと、今にも小気味のよいビートが聞こえてきそうだから不思議なものである。 だいたいこんなような感じ。

パーフェクトRuby (PERFECT SERIES 6)

パーフェクトRuby (PERFECT SERIES 6)