#erlang #swagger #openapi
#erlang #развязность #openapi
Вопрос:
Я пытаюсь создать свой собственный REST API с использованием Erlang. Я следую руководству, которое можно найти по адресу: https://github.com/OpenAPITools/openapi-generator/tree/master/samples/server/petstore/erlang-server .
В настоящее время я застрял на последней точке: после запуска из оболочки Erlang 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:
Первое, чего вам не хватает, это -i
флага для curl
. curl
не печатает код ответа http, если вы не укажете это.
$ curl -i -X GET "http://127.0.0.1:8080/v2/pet/44362" -H "accept: application/json"
Покажет, что сервер фактически отвечает http-кодом 401
(неавторизованным), глядя на схему OpenAPI для GetPetById
( operationId
для конечной точки, которую вы пытаетесь использовать), мы видим, что для этого требуется ключ api в качестве заголовка, названного api_key
в http-запросе (см. securityDefinitions
Раздел в схеме OpenAPI). Итак, реальная 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 генерирует только каркасы, необходимые для построения фактической логики для каждого обработчика конечной точки. Инструмент generator не имеет возможности узнать, как вы хотите обрабатывать входящие запросы, поэтому он генерирует универсальный обработчик, который возвращает 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
значения заголовка, по умолчанию оно допускает любое значение.