外部の Web API を呼び出して取得した JSON を格納するクラスをいちいち定義するのが面倒だったんだけど、つい先日閃いた。「Web API のレスポンスのボディは JSON なんだから、その JSON をもとにソースコードを生成すればいいじゃないか」ってね。
Ruby でさくっと書いてみた。Web API の呼び出しには Faraday を使用。
require "erb" require "json" require "faraday" # ソースコードを生成するためのテンプレート TEMPLATE = <<EOT class <%= @name %> <% @model.each do |key, value| %> attr_accessor :<%= key %> <% end %> end EOT conn = Faraday.new do |builder| builder.request :url_encoded builder.request :retry builder.response :logger builder.adapter :net_http end # ベーシック認証の設定 conn.basic_auth("username", "password") # Web API 呼び出し response = conn.get do |req| req.url "https://api.bitbucket.org/1.0/user" end # レスポンスボディを JSON に変換 json = JSON.parse(response.body) # eRuby で出力 @model = json["user"] @name = "User" puts ERB.new(TEMPLATE).run
このスクリプトを実行して出力されたコードがこちら。
class User attr_accessor :username attr_accessor :first_name attr_accessor :last_name attr_accessor :display_name attr_accessor :is_team attr_accessor :avatar attr_accessor :resource_uri end
サンプルは Bitbucket API を呼び出して Ruby のクラスを生成したけど、Web API の URI やテンプレートを編集すれば、いろんな Web API 用クラスが生成できる。
ベーシック認証にしかまだ対応してないから、Twitter API とか呼べないけど、それも OAuth に対応すれば済む話。Faraday のミドルウェア使えば難しくなさそうだ。