我正在尝试使用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错误。
我想念什么?
答案 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
标头值的验证,默认情况下,它允许任何值。