Basé sur la réponse au problème avec x-www-form-urlencoded avec Spring @Controller
J'ai écrit la méthode @Controller ci-dessous
@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST
, produces = {"application/json", "application/xml"}
, consumes = {"application/x-www-form-urlencoded"}
)
public
@ResponseBody
Representation authenticate(@PathVariable("email") String anEmailAddress,
@RequestBody MultiValueMap paramMap)
throws Exception {
if(paramMap == null || paramMap.get("password") == null) {
throw new IllegalArgumentException("Password not provided");
}
}
la demande à laquelle échoue avec l'erreur ci-dessous
{
"timestamp": 1447911866786,
"status": 415,
"error": "Unsupported Media Type",
"exception": "org.springframework.web.HttpMediaTypeNotSupportedException",
"message": "Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported",
"path": "/users/usermail%40gmail.com/authenticate"
}
[PS: Jersey était beaucoup plus convivial, mais ne pouvait pas l'utiliser maintenant étant donné les restrictions pratiques ici]
spring
spring-mvc
model-view-controller
Somasundaram Sekar
la source
la source
JSON.stringify({"ordersToDownload":"00417002"}
$.ajax({url:"/myurl", type:"POST", data: JSON.stringify({"someAttribute":"someData"}) })
Réponses:
Le problème est que lorsque nous utilisons application / x-www-form-urlencoded , Spring ne le comprend pas comme un RequestBody. Donc, si nous voulons l'utiliser, nous devons supprimer l' annotation @RequestBody .
Ensuite, essayez ce qui suit:
@RequestMapping(value = "/{email}/authenticate", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE, produces = {MediaType.APPLICATION_ATOM_XML_VALUE, MediaType.APPLICATION_JSON_VALUE}) public @ResponseBody Representation authenticate(@PathVariable("email") String anEmailAddress, MultiValueMap paramMap) throws Exception { if(paramMap == null && paramMap.get("password") == null) { throw new IllegalArgumentException("Password not provided"); } return null; }
Notez que l'annotation @RequestBody a été supprimée
Réponse : La demande de publication HTTP avec le type de contenu application / x-www-form-urlencoded ne fonctionne pas au printemps
la source
application/x-www-form-urlencoded
?@ModelAttribute, even though this behaviour is (sadly) not documented. And
@ModelAttribute comprenait x-www-form-urlencodedIl semble que maintenant vous pouvez simplement marquer le paramètre de méthode avec
@RequestParam
et il fera le travail pour vous.@PostMapping( "some/request/path" ) public void someControllerMethod( @RequestParam Map<String, String> body ) { //work with Map }
la source
Ajoutez un en-tête à votre demande pour définir le type de contenu sur application / json
curl -H 'Content-Type: application/json' -s -XPOST http://your.domain.com/ -d YOUR_JSON_BODY
de cette façon, le printemps sait comment analyser le contenu.
la source
Au printemps 5
@PostMapping( "some/request/path" ) public void someControllerMethod( @RequestParam MultiValueMap body ) { // import org.springframework.util.MultiValueMap; String datax = (String) body .getFirst("datax"); }
la source
Le simple fait de supprimer l'
@RequestBody
annotation résout le problème (testé sur Spring Boot 2):@RestController public class MyController { @PostMapping public void method(@Valid RequestDto dto) { // method body ... } }
la source
J'ai écrit sur une alternative dans cette réponse StackOverflow .
Là, j'ai écrit étape par étape, en expliquant avec du code. Le chemin court:
Premièrement : écrire un objet
Deuxièmement : créer un convertisseur pour mapper le modèle en étendant le AbstractHttpMessageConverter
Troisièmement : dites au printemps d'utiliser ce convertisseur implémentant un WebMvcConfigurer.class remplaçant la méthode configureMessageConverters
Quatrième et dernier: l'utilisation de ce paramètre d'implémentation dans le mappage à l'intérieur de votre contrôleur consomme = MediaType.APPLICATION_FORM_URLENCODED_VALUE et @RequestBody devant votre objet.
J'utilise Spring Boot 2.
la source
@PostMapping(path = "/my/endpoint", consumes = { MediaType.APPLICATION_FORM_URLENCODED_VALUE }) public ResponseEntity<Void> handleBrowserSubmissions(MyDTO dto) throws Exception { ... }
Cette façon fonctionne pour moi
la source