Web API のレスポンスからクラスのソースコードを生成してみた

外部の 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 APIURI やテンプレートを編集すれば、いろんな Web API 用クラスが生成できる。

ベーシック認証にしかまだ対応してないから、Twitter API とか呼べないけど、それも OAuth に対応すれば済む話。Faraday のミドルウェア使えば難しくなさそうだ。