【Ruby】簡単なAPIを叩いてみる(郵便番号検索API)


環境

macOS: Big Sur Ver11.2.2
Ruby: 2.6.5

記事の背景

「Webアプリの開発で外部APIを使わないことはほぼない!」ということを聞いて慌ててAPIについて勉強し始めました。第一歩として、郵便番号を検索する簡単なAPIでプログラムを実装。
調べていくと「Faraday」というGemがリクエストとレスポンスを比較的シンプルに書けるらしく、このGemを使った方法でも実装してみました。
どちらもRubyのファイルを単独で生成して、そこに記述してターミナル上で実行しています。

実装①

Rubyの外部ライブラリをrequireして最も基本的な形で実装

上記のGemを使わず、基本に則ったやり方で実装。

potal_code.rb
# このプログラムで使うメソッドが組み込みライブラリではないので必要なライブラリを読み込む必要がある
# この2つは基本となるのでrequireする
require 'uri'
require 'net/http'
# レスポンスがJson形式で返ってくるので、それをRubyのオブジェクトに変換するのに必要な外部ライブラリ
require "json"

def get_address(zip_code)
  # 引数を使って postal_code=1111111 のような形をつくる
  query = URI.encode_www_form(zipcode: zip_code)
  # リクエストを送るURIを生成
  uri = URI.parse("https://zipcloud.ibsnet.co.jp/api/search?#{query}")
  # 上記のURIに実際にリクエストを送り、返ってくるレスポンスをresponseに格納
  response = Net::HTTP.get_response(uri)
  # 返ってきたresponseのbody部分をJSONからRubyのハッシュに変換
  result = JSON.parse(response.body)
  # 上記までで返ってきたレスポンスがブラウザに表示されているのと同じ状態になっている。あとは返ってきた情報を使うだけ。
  postal_code = result["results"][0]["zipcode"]
  prefecture = result["results"][0]["address1"]
  city = result["results"][0]["address2"]
  region = result["results"][0]["address3"]

  puts "郵便番号は#{postal_code}、住所は#{prefecture}#{city}#{region}です"
end

# 上で作成したメソッドを実行
get_address(ハイフン無しの郵便番号を半角で入力)

解説

流れとしては、
①リクエストと送るURLを定義し、URL末尾に渡すクエリパラメーターも定義する。
 クエリパラメータの生成には、URI.encode_www_formメソッドを使う。
 このメソッドは外部ライブラリを読み込んでいるから使えるようになっている!

②リクエストを送り、レスポンスを得る。
 ①で定義したURLにNet::HTTP.get_responseメソッドでリクエストを送る(これも外部ライブラリのおかげ)。
 返ってくるレスポンスを変数responseに格納。

③返ってきたレスポンスはJson形式なので、JSON.parseメソッドでRubyのオブジェクトに変換が必要

④最後にハッシュ形式になっているデータから使いたいデータを取り出し、利用します。

返ってくるデータは以下を参照
郵便番号検索API

実装②

Gem「Faraday」を使ってもう少し簡単に実装

基本的な流れは一緒ですが、こちらのやり方は少し記述量が減ります!
まず準備として公式ドキュメントに掲載されている通り、ターミナルでGemをインストールします。

 % gem install faraday
 % gem install faraday_middleware

あとはドキュメントを見ながら実装してみました。

# ターミナルで「gem install faraday」コマンドを打ってから
require 'faraday'
# ターミナルで「gem install faraday_middleware」コマンドを打ってから
require 'faraday_middleware'
# 外部ライブラリをrequire
require "json"

def get_address(zip_code)
  url = 'https://zipcloud.ibsnet.co.jp/api/search'
  response = Faraday.get(url, {zipcode: zip_code}, {'Accept' => 'application/json'})
  # 返ってくるJson形式のレスポンスをRubyのオブジェクトに変換
  result = JSON.parse(response.body)

  postal_code = result["results"][0]["zipcode"]
  prefecture = result["results"][0]["address1"]
  city = result["results"][0]["address2"]
  region = result["results"][0]["address3"]

  puts "郵便番号は#{postal_code}、住所は#{prefecture}#{city}#{region}です"
end

get_address(ハイフン無しの郵便番号を半角で入力)

違うのは前半のリクエストURLを生成してレスポンスを送るまでのところですね。
ちなみにJSON.parseとしてRubyハッシュに変換するのは必須みたい。これやらないとデータを受け取れませんでした。

最後に

今回使用したFaradayはRubyのGemの公式サイトではかなりダウンロード数も多く、実務でも使われているのではという印象。
次はYouTubeあたりのAPIを叩きたい...

以上。