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