PUT: PathVariable и RequestParam не работают вместе - PullRequest
4 голосов
/ 26 марта 2019

Я использую Spring boot 2.1.3-RELEASE. В моем RestController я пытаюсь настроить метод PUT с одним PathVariable и RequestParam (application / x-www-form-urlencoded). Однако, когда я называю это, ответ является неправильным запросом, потому что требуемый RequestParam отсутствует.

Я попытался изменить PutMapping на RequestMapping, поменять местами параметры и использовать синтаксис @RequestParam (value = "param2", required = false), но ничего не изменилось.

Любопытно, что работает PostMapping. Также удаление PathVariable работает.

Вот код RestController:

@PutMapping(value="/myurl/{param1}", consumes=MediaType.APPLICATION_FORM_URLENCODED_VALUE)
public String myMethod( @PathVariable("param1") Integer param1, @RequestParam("param2") String param2);

Я называю метод следующим образом:

curl -X PUT \
  http://localhost:8080/myurl/42 \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  -d 'param2=myparam2value'

Ответ:

{ «отметка времени»: 1553613278534, «статус»: 400, «ошибка»: «Неверный запрос», "message": "Обязательный параметр String 'param2' отсутствует", "путь": "/ myurl / 42" }

Я ожидаю, что PUT работает так же, как POST, но, похоже, нет.

К сожалению, я не могу отправить параметры как QueryParam, поэтому я должен поддерживать тот же вызов запроса, потому что я реорганизую существующую конечную точку, которая работает именно таким образом.

Спасибо


EDIT

Я обнаружил, что это вызвано использованием HandlerInterceptorAdapter (через WebMvcConfigurer). По какой-то причине около

org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues

org.apache.coyote.Request.parameters не имеет содержимого, и генерируется исключение, поэтому оно работает только для POST, а не для PUT (GET обрабатываются по-разному).

Буду признателен, если кто-нибудь подскажет, можно ли сообщить об этом как об ошибке, учитывая, что удаление перехватчика сделало его работоспособным.

Привет

1 Ответ

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

Использование -G вместе с --data-urlencode:

curl -G -X PUT \
  http://localhost:8080/myurl/42 \
  -H 'Accept: application/json' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'param2=myparam2value'

Из документации :

-G, --get

При использовании этого параметра все данные, указанные с помощью -d, --data, --data-binary или --data-urlencode, будут использоваться в HTTP * 1023.* запрос вместо POST запроса, который в противном случае использовался бы.Данные будут добавлены к URL с разделителем ?.[...]

--data-urlencode <data>

(HTTP). Здесь публикуются данные, аналогичные другим опциям -d, --data, за исключением того, что этотвыполняет URL-кодирование.[...]

...