Использование заглушек из генератора OpenAPI

#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 значения заголовка, по умолчанию оно допускает любое значение.