Помощник для создания динамического клиента Ruby OpenAPI/Swagger для REST API

Я использовал Bravado для создания клиента Python для API REST для магазина домашних животных.

Мне нужно сделать то же самое, чтобы подключить динамический Ruby-клиент к REST API.

  • Я видел список инструментов на странице Swagger по интеграции ОС, но большинство из них, по-видимому, предназначены для автоматизации тестов с использованием Swagger или для создания API Swagger/openapi, а не для создания клиента, который использует API Swagger.

  • Svelte, это "Динамический Ruby API-клиент от Swagger JSON Spec" в приведенном выше списке. Это может быть хорошим кандидатом и похоже на библиотеку Bravado Python, которую я уже использую, но:

    • Похоже, что проверка параметров запроса выполняется только для параметров на основе URL, поэтому она не будет предоставлять запросы и проверку ответов по спецификации Swagger 2.0, как здесь.
    • Svelte возвращает Faraday::Request, а не экземпляр модели.
  • Ruby gem OpenAPI официально является оболочкой Ruby, что мы и ищем, но документации пока нет. Основной README: "В Active Dev. Документация идет"
  • Excon (спасибо @kevin-burnett за указание на это) не предоставляет автоматическую оболочку API, описанную Swagger, это HTTP-клиент, соответствующий запросам Python, поэтому библиотека для ручного использования API-интерфейса.

Вот код на Python, который является той функцией, которую мы ищем в Ruby:

Чтобы получить простой точный ответ (без использования моделей):

from bravado.client import SwaggerClient
from bravado.fido_client import FidoClient

client = SwaggerClient.from_url(
    'http://petstore.swagger.io/v2/swagger.json',
    config={'use_models': False}
)

result = client.pet.getPetById(petId=42).result(timeout=4)

предоставлять:

>>> result
{'category': {'id': 42, 'name': 'string'},
 'id': 42,
 'name': 'doggie',
 'photoUrls': ['string', 'string2'],
 'status': 'available',
 'tags': [{'id': 42, 'name': 'string'}]}

И даже лучше, по умолчанию используя модель:

> from bravado.client import SwaggerClient

> client = SwaggerClient.from_url("http://petstore.swagger.io/v2/swagger.json")
> pet = client.pet.getPetById(petId=42).result()
> print(pet)
Pet(category=Category(id=42, name='string'), id=42,
    name='doggie', photoUrls=['string', 'string2'],
    status='available',
    tags=[Tag(id=42, name='string')])
>

2 ответа

Вы можете использовать ruby- swagger для конвертации swagger.json в API-клиент

Вы можете посмотреть на эту команду:

 rake swagger:generate_client:ruby

Также вы можете посмотреть на swagger-codegen

Есть много других, но excon довольно мил.

Включите его в свой Gemfile:

gem 'excon'

Затем, чтобы сделать запрос GET, например:

require 'json'
require 'excon'
excon_result = Excon.get('http://petstore.swagger.io/v2/pet/findByStatus?status=pending')
response_body_as_string = excon_result.body
pets = JSON.parse(response_body_as_string)
pets.first['name'] # "hello kity with form updated" (sic)

Excon имеет много полезных функций, таких как expects опция, позволяющая указать список ожидаемых кодов состояния http. Если ответ выходит за рамки ожидаемого, он будет повышаться автоматически.

Другие вопросы по тегам