#java #swagger #resteasy #quarkus #x-www-form-urlencoded
#java #swagger #resteasy #quarkus #x-www-form-urlencoded
Вопрос:
У меня есть конечная точка API, которая ожидает один параметр массива form-urlencoded. Это соответствующий фрагмент Java:
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response addItems(@Parameter(description = "Items to add") @FormParam("items") List<Long> items) {
return service.addItems(items);
}
Я не могу достичь конечной точки из сгенерированного пользовательского интерфейса Swagger из-за следующей ошибки:
RESTEASY003870: Unable to extract parameter from http request: javax.ws.rs.FormParam(amp;quot;itemsamp;quot;) value is amp;#x27;1,2,3amp;#x27;
Из того, что я прочитал, Swagger делает этот запрос:
curl -X 'POST'
'http://localhost:8080/items'
-H 'accept: */*'
-H 'Content-Type: application/x-www-form-urlencoded'
-d 'items=1,2,3'
Мне кажется, что виновником является то, как Swagger сериализует массив: Swagger отправляет это items=1,2,3
, в то время как RESTEasy ожидает этого items=1amp;items=2amp;items=3
.
Я уже прочитал соответствующую документацию Swagger и перепробовал все комбинации стиля / разнесения, включая те, которые кажутся мне наиболее разумными ( style = ParameterStyle.SIMPLE, explode = TRUE
что, кстати, должно быть поведением по умолчанию), но безуспешно.
Итак, как я должен аннотировать эту конечную точку, чтобы Swagger мог ее вызывать?
Ответ №1:
Я использовал https://github.com/quarkusio/quarkus-quickstarts/tree/main/openapi-swaggerui-quickstart и добавил свой метод в FruitResource
Согласно документации swagger, если вы хотите использовать форму urlencoded
application/x-www-form-urlencoded используется для отправки простых текстовых данных ASCII в виде пар ключ = значение. Формат полезной нагрузки аналогичен параметрам запроса.
в https://swagger.io/docs/specification/describing-request-body /, поэтому там написано использовать параметры запроса, и я изменил вашу функцию на
@POST
@Consumes(MediaType.APPLICATION_FORM_URLENCODED)
@Produces(MediaType.APPLICATION_JSON)
public Response addItems(
@Parameter(description = "Items to add") @QueryParam(
"items"
) List<Long> items
) {
return service.addItems(items);
}
и откройте dev-ui
Как вы можете видеть, пользовательский интерфейс предотвращает добавление неправильных параметров, исправьте пользовательский интерфейс ниже
и созданная команда curl работает должным образом.
curl -X 'POST'
'http://localhost:8080/fruits?items=1amp;items=2'
-H 'accept: */*'
-d ''
на случай, если вы хотите протестировать код, он находится здесь.