4 votes

PUT : PathVariable et RequestParam ne fonctionnent pas ensemble

J'utilise Spring boot 2.1.3-RELEASE. Dans mon RestController, j'essaie de mettre en place une méthode PUT avec une PathVariable et un RequestParam (application/x-www-form-urlencoded). Cependant, lorsque je l'appelle, la réponse est une mauvaise requête car le RequestParam requis n'est pas présent.

J'ai essayé de remplacer PutMapping par RequestMapping, d'intervertir la position des paramètres et d'utiliser la syntaxe @RequestParam(value="param2", required=false), mais rien ne change.

Curieusement, l'utilisation de PostMapping fonctionne. La suppression de PathVariable fonctionne également.

Voici le code du RestController :

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

J'appelle la méthode de cette manière :

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

La réponse est la suivante :

{ "timestamp" : 1553613278534, "status" : 400, "error" : "Bad Request", "message" : "Paramètre de chaîne requis 'param2' i "path" : "/myurl/42" }

Je m'attendais à ce que PUT fonctionne comme POST, mais il semble que ce ne soit pas le cas.

Malheureusement, je ne peux pas envoyer de paramètres en tant que QueryParam, et je dois donc conserver le même appel de requête car je suis en train de refaire un point de terminaison existant qui fonctionne exactement de cette manière.

Gracias


EDIT

J'ai découvert que ce problème est dû à l'utilisation d'un HandlerInterceptorAdapter (via WebMvcConfigurer). Pour une raison quelconque, autour de

org.springframework.web.util.ContentCachingRequestWrapper.getParameterValues

org.apache.coyote.Request.parameters n'a pas de contenu et une exception est levée, donc cela ne fonctionne que pour POST et pas pour PUT (GET est géré différemment).

J'apprécierais que quelqu'un me dise si cela peut être signalé comme un bogue étant donné que la suppression de l'intercepteur l'a fait fonctionner.

Salutations

1voto

Utilisation -G ainsi que --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'

A partir de la la documentation :

-G , --get

Lorsque cette option est utilisée, toutes les données spécifiées avec l'option -d , --data , --data-binary o --data-urlencode à utiliser dans un message HTTP GET au lieu de la demande POST qui serait autrement utilisée. Les données seront ajoutées à l'URL avec une balise ? séparateur. [...]

--data-urlencode <data>

(HTTP) Ces données sont affichées, de la même manière que les autres données de l -d , --data à l'exception de l'encodage de l'URL. [...]

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X