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

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 のミドルウェア使えば難しくなさそうだ。