使用来自 OpenAPI 生成器的存根

Usage of stubs from OpenAPI generator

我正在尝试使用 Erlang 构建我自己的 REST API。我正在按照可以在以下位置找到的指南进行操作: https://github.com/OpenAPITools/openapi-generator/tree/master/samples/server/petstore/erlang-server.

现在我目前停留在最后一点:在 运行ning 来自 Erlang shell application:ensure_all_started(http_server). 我认为应用程序是 运行ning,因为来自 netstat -nlt | grep LISTEN 我可以看到正在监听 127.0.0.1:8080 的进程。 例如,如果我尝试 运行:

curl -X GET "http://127.0.0.1:8080/v2/pet/44362" -H "accept: application/json"

我没有得到服务器的响应,在服务器上我只看到 Attempt to process operation: GetPetById",没有其他任何反应。我认为它应该 return 404 错误。

我错过了什么?

您缺少的第一件事是 -i 标记到 curlcurl 如果您不告诉它,则不会打印 http 响应代码。

$ curl -i -X GET "http://127.0.0.1:8080/v2/pet/44362" -H "accept: application/json"

将显示服务器实际响应 http 代码 401(未经授权),查看 GetPetById 的 OpenAPI 模式(您正在尝试的端点的 operationId)我们可以看到它需要一个 api 密钥作为 http 请求中名为 api_key 的 header(请参阅 OpenAPI 架构中的 securityDefinitions 部分)。所以我们真正需要的curl命令是

curl -i -X GET "http://127.0.0.1:8080/v2/pet/2342" -H "api_key: asdf" -H "accept: application/json"

(您可以为 api_key 使用任何值)

但是,这不会给出您预期的答案(响应代码 404),您会得到 501(未实现)。 这是因为 openapi 生成器工具只生成您为每个端点处理程序构建实际逻辑所需的脚手架。生成器工具无法知道您希望如何处理传入请求,因此它会生成一个通用处理程序,returns 501 响应。

查看 openapi_default_logic_handler.erl 文件,在那里你会发现 handle_request/3 这是请求处理程序。 处理 GetPetById 端点的最小更改是:

handle_request('GetPetById', _Req, _Context) ->
  % This is a hardcoded 404 response for all id's.
  % add your logic here to e.g try to fetch the id from a database 
  {404, #{}, #{}};
handle_request(OperationID, Req, Context) ->
    error_logger:error_msg(
        "Got not implemented request to process: ~p~n",
        [{OperationID, Req, Context}]
    ),
    {501, #{}, #{}}.

另请注意,在文件 openapi_default_logic_handler.erl 中定义了函数 authorize_api_key/2。这就是您可以实现 api_key header 值验证的地方,默认情况下它允许任何值。