来自OpenAPI生成器的存根的使用

时间:2019-03-08 10:31:35

标签: erlang swagger openapi

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

现在,我现在停留在最后一点:从Erlang shell application:ensure_all_started(http_server).运行之后,我认为应用程序正在运行,因为从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",并且什么也没有发生。我认为应该返回404错误。

我想念什么?

1 个答案:

答案 0 :(得分:1)

您缺少的第一件事是-i的{​​{1}}标志。如果您不告知,curl不会打印http响应代码。

curl

将显示服务器实际上以http代码$ curl -i -X GET "http://127.0.0.1:8080/v2/pet/44362" -H "accept: application/json" 响应(未经授权),查看401的OpenAPI模式(您尝试的端点的GetPetById),我们可以看到它需要一个api键作为http请求中名为operationId的标头(请参阅OpenAPI模式中的api_key部分)。因此,我们真正需要的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(未实现)。 这是因为openapi生成器工具仅生成您为每个端点处理程序构建实际逻辑所需的支架。生成器工具无法知道您要如何处理传入的请求,因此它会生成一个通用处理程序,该处理程序返回501响应。

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标头值的验证,默认情况下,它允许任何值。