Использование заглушек из генератора OpenAPI - PullRequest
0 голосов
/ 08 марта 2019

Я пытаюсь создать свой собственный 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 Ответ

1 голос
/ 18 марта 2019

Первое, что вам не хватает, это флаг -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 генерирует только те леса, которые необходимы для построения фактической логики для каждого обработчика конечной точки.У инструмента генератора нет способа узнать, как вы хотите обрабатывать входящие запросы, поэтому он генерирует общий обработчик, который возвращает ответ 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, по умолчанию оно допускает любое значение.

...