Hello, OpenAPI - OpenAPI GeneratorでRubyクライアントを生成


はじめに

引き続き OpenAPI で遊んでいる。今回は前回PetStore モックサーバに対して、openapi-generator1 で生成したRubyクライアントからアクセスしてみる

インストール

openapi-generator をインストールするところから

$ brew install openapi-generator

次に ruby クライアントの生成

$ openapi-generator generate -i https://raw.githubusercontent.com/openapitools/openapi-generator/master/modules/openapi-generator/src/test/resources/2_0/petstore.yaml -g ruby -o .

何やらたくさんファイルが生成される

.
├── Gemfile
├── README.md
├── Rakefile
├── docs
│   ├── ApiResponse.md
│   ├── Category.md
│   ├── Order.md
│   ├── Pet.md
│   ├── PetApi.md
│   ├── StoreApi.md
│   ├── Tag.md
│   ├── User.md
│   └── UserApi.md
├── git_push.sh
├── lib
│   ├── openapi_client
│   │   ├── api
│   │   │   ├── pet_api.rb
│   │   │   ├── store_api.rb
│   │   │   └── user_api.rb
│   │   ├── api_client.rb
│   │   ├── api_error.rb
│   │   ├── configuration.rb
│   │   ├── models
│   │   │   ├── api_response.rb
│   │   │   ├── category.rb
│   │   │   ├── order.rb
│   │   │   ├── pet.rb
│   │   │   ├── tag.rb
│   │   │   └── user.rb
│   │   └── version.rb
│   └── openapi_client.rb
├── openapi_client.gemspec
└── spec
    ├── api
    │   ├── pet_api_spec.rb
    │   ├── store_api_spec.rb
    │   └── user_api_spec.rb
    ├── api_client_spec.rb
    ├── configuration_spec.rb
    ├── models
    │   ├── api_response_spec.rb
    │   ├── category_spec.rb
    │   ├── order_spec.rb
    │   ├── pet_spec.rb
    │   ├── tag_spec.rb
    │   └── user_spec.rb
    └── spec_helper.rb

クライアントに関しては lib/openapi_client.rblib/openapi_client を意識すれば良さそうです

生成したコードの使い方

lib 以下にクライアント関連の Ruby モジュールが生成されている。ドキュメントがあんまりないので、コード読みながら手探りで作ったクライアントはこんな感じ

pet-client.rb
$LOAD_PATH.push('.')

require 'openapi_client'

OpenapiClient.configure do |config|
  config.base_path = ""
  config.host = "localhost:4010"
  config.api_key['api_key'] = 'special_key'
  #config.debugging = true
end

api_instance = OpenapiClient::PetApi.new
data = { "id": 112354, "category": { "id": 0, "name": "taro" }, "name": "john", "photo_urls": [ "http://image.com" ], "tags": [ { 
body = OpenapiClient::Pet.new(data)

begin
  puts "GET"
  pet = api_instance.get_pet_by_id(1)
  puts JSON.pretty_generate(pet.to_body)

  puts "POST"
  pet1 = api_instance.add_pet(body, {:header_params => {"Content-Type": "application/json", "accept": "application/json"}})
  puts pet1.class
rescue OpenapiClient::ApiError => e
  puts "Exception when calling PetApi->add_pet: #{e}"
end
  • Pet.new(data) で渡す dataHash で渡す。JSON の時のキーそのままではだめで、スネークケースで渡さないといけない(PhotoUrls > photo_urls

このクライアントでモックサーバに対して、GET POST ともに動いているようなので、ひとまずよしとします。まだ Hello World レベルですが、ここまではいい感じで使えるコードが生成されているように感じます。あとは、もうちょっとドキュメントあると嬉しいのだが...できればサンプルコードとか。ご存知のかた教えて下さい

さて、とりあえず使い方がわかった気がするので、次にいきます