Как аннотировать форму списка Java-urlencoded параметр urlencoded для Swagger?

#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

quarkus dev ui

Как вы можете видеть, пользовательский интерфейс предотвращает добавление неправильных параметров, исправьте пользовательский интерфейс ниже

вызов swagger

и созданная команда curl работает должным образом.

 curl -X 'POST' 
  'http://localhost:8080/fruits?items=1amp;items=2' 
  -H 'accept: */*' 
  -d ''
 

на случай, если вы хотите протестировать код, он находится здесь.