Генерируем http-файлы из Спецификации OpenAPI
Http-файлы хороши и удобны, но их обновление также требует определенных усилий. Почему бы не сгенерировать их из cпецификации OpenAPI?
Когда вы создаете новый http-файл для веб-API в .NET 8, вы получаете файл MyProjectName.http. Он выглядит примерно так:
@MyWebApp_HostAddress = http://localhost:5059
GET {{MyWebApp_HostAddress}}/weatherforecast/
Accept: application/json
###
Этот файл используется расширением REST Client в Visual Studio Code, Visual Studio и Rider, что позволяет отправлять HTTP-запросы к вашему API прямо из редактора.
Но есть проблема: их обновление может быть хлопотным. Представьте, что мы добавляем в наш API две новые конечные точки:
app.MapPost("/weatherforecast",
(CreateWeatherDto dto) => TypedResults.Ok())
.WithName("CreateWeatherForecast")
.WithOpenApi();
app.MapDelete("/weatherforecast/{id}",
(int id) => TypedResults.Ok())
.WithName("DeleteWeatherForecast")
.WithOpenApi();Чтобы сгенерировать для них запросы в http-файл, используем утилиту httpgenerator.
Установка её очень проста:
dotnet tool install --global httpgenerator
Теперь её можно использовать, передав ей путь к спецификации OpenAPI (локальный или, при запущенном API, URL):
httpgenerator http://localhost:5059/api/v1/openapi.json --output-type OneFile
--output-type OneFile объединит все конечные точки в один файл, иначе вы получите n файлов для каждой конечной точки, что не очень удобно. Файл всегда будет называться Requests.http и будет помещён в текущий каталог (если не указано иное с помощью параметра --output). Поэтому вы можете переименовать его в MyProjectName.http, чтобы соответствовать соглашению об именах. Получим примерно такой результат:@contentType = application/json
###################################
### Request: GET /weatherforecast
###################################
GET http://localhost:5059/weatherforecast
Content-Type: {{contentType}}
####################################
### Request: POST /weatherforecast
####################################
POST http://localhost:5059/weatherforecast
Content-Type: {{contentType}}
{
"temperatureC": 0,
"summary": "summary"
}
###########################################
### Request: DELETE /weatherforecast/{id}
###########################################
### Path Parameter: DeleteWeatherForecast_id
@DeleteWeatherForecast_id = 0
DELETE http://localhost:5059/weatherforecast/{{DeleteWeatherForecast_id}}
Content-Type: {{contentType}}
Утилита также поддерживает другие параметры, в том числе передачу Bearer-токенов, о чём можно почитать на странице проекта в GitHub.
Источник: https://steven-giesel.com/blogPost/9fa236ef-67da-4113-95e7-99770dc70444/generate-http-files-from-a-swagger-definition