7

我使用Bravadopetstore的 REST API 创建了一个 Python 客户端。

我需要做同样的事情来获取 REST API 的动态 Ruby 客户端。

  • 我在OS 集成 Swagger 页面中看到了工具列表,但其中大多数似乎是使用 Swagger 自动化测试或创建 Swagger/openapi API,而不是创建使用 Swagger API 的客户端。

  • Svelte是上面列表中的“来自 Swagger JSON Spec 的动态 Ruby API 客户端”。它可能是一个很好的候选者,并且看起来类似于我已经使用的Bravado Python 库,但是:

    • 似乎请求参数验证仅针对基于 URL 的参数进行,因此它不会提供请求,并且针对 Swagger 2.0 规范的响应验证就像这里一样。
    • Svelte 返回 Faraday::Request 而不是模型实例。
  • Ruby gem OpenAPI是正式的 Ruby 包装器,这是我们正在寻找的,但目前还没有任何文档 Cf. 主要自述文件:“在活动开发中。文档即将推出”
  • Excon(感谢@kevin-burnett 指出)没有为 Swagger 描述的 API 提供自动包装器,它是一个 HTTP 客户端,对应于 Python 的Requests,因此是一个手动使用 API 的库。

这是我们在 Ruby 中寻找的那种特性的 Python 代码:

要获得简单的 dict 答案(不使用模型):

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')])
>
4

2 回答 2

2

您可以使用ruby ​​-swagger 将 swagger.json 转换为 API 客户端

你可以看看这个命令:

 rake swagger:generate_client:ruby

你也可以看看swagger-codegen

于 2017-05-08T15:22:05.533 回答
0

还有很多其他的,但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 状态代码列表的选项。如果响应超出预期,它将自动引发。

于 2017-04-29T18:08:43.513 回答