java jquery spring rest spring-mvc

java - La solicitud de publicación HTTP con el tipo de contenido application/x-www-form-urlencoded no funciona en Spring



jquery rest (6)

Debe decirle a Spring qué tipo de contenido de entrada admite su servicio. Puede hacerlo con el elemento de anotación "consume" que corresponde al encabezado "Tipo de contenido" de su solicitud.

@RequestMapping(value = "/", method = RequestMethod.POST, consumes = {"application/x-www-form-urlencoded"})

Sería útil si publicaras tu código.

Soy nuevo en Spring actualmente estoy tratando de hacer la solicitud de solicitud HTTP POST / x-www-form-url codificada, pero cuando guardo esto en mis encabezados, spring no lo reconoce y dice 415 Unsupported Media Type de medio 415 Unsupported Media Type para x-www-form-urlencoded

org.springframework.web.HttpMediaTypeNotSupportedException: tipo de contenido ''application / x-www-form-urlencoded'' no compatible

¿Alguien puede saber cómo resolverlo? por favor comentame

Un ejemplo de mi controlador es:

@RequestMapping( value = "/patientdetails", method = RequestMethod.POST, headers="Accept=application/x-www-form-urlencoded") public @ResponseBody List<PatientProfileDto> getPatientDetails( @RequestBody PatientProfileDto name ) { List<PatientProfileDto> list = new ArrayList<PatientProfileDto>(); list = service.getPatient(name); return list; }


El problema es que cuando usamos application / x-www-form-urlencoded , Spring no lo entiende como RequestBody. Entonces, si queremos usar esto, debemos eliminar la anotación @RequestBody .

Luego intente lo siguiente:

@RequestMapping(value = "/patientdetails", method = RequestMethod.POST,consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE) public @ResponseBody List<PatientProfileDto> getPatientDetails( PatientProfileDto name) { List<PatientProfileDto> list = new ArrayList<PatientProfileDto>(); list = service.getPatient(name); return list; }

Tenga en cuenta que eliminó la anotación @RequestBody


La solución se puede encontrar aquí https://github.com/spring-projects/spring-framework/issues/22734

puede crear dos asignaciones de solicitud posterior separadas. Por ejemplo.

@PostMapping(path = "/test", consumes = "application/json") public String test(@RequestBody User user) { return user.toString(); } @PostMapping(path = "/test", consumes = "application/x-www-form-urlencoded") public String test(User user) { return user.toString(); }


Lo más fácil es configurar el tipo de contenido de su solicitud ajax en "application/json; charset=utf-8" y luego dejar que su método API consuma JSON. Me gusta esto:

var basicInfo = JSON.stringify({ firstName: playerProfile.firstName(), lastName: playerProfile.lastName(), gender: playerProfile.gender(), address: playerProfile.address(), country: playerProfile.country(), bio: playerProfile.bio() }); $.ajax({ url: "http://localhost:8080/social/profile/update", type: ''POST'', dataType: ''json'', contentType: "application/json; charset=utf-8", data: basicInfo, success: function(data) { // ... } }); @RequestMapping( value = "/profile/update", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<ResponseModel> UpdateUserProfile( @RequestBody User usersNewDetails, HttpServletRequest request, HttpServletResponse response ) { // ... }

Supongo que el problema es que Spring Boot tiene problemas para enviar datos de formularios que no son JSON a través de una solicitud ajax.

Nota: el tipo de contenido predeterminado para ajax es "application/x-www-form-urlencoded" .


debe reemplazar @RequestBody con @RequestParam y no aceptar parámetros con una entidad java.

Entonces su controlador es probablemente así:

@RequestMapping(value = "/patientdetails", method = RequestMethod.POST, consumes = {MediaType.APPLICATION_FORM_URLENCODED_VALUE}) public @ResponseBody List<PatientProfileDto> getPatientDetails( @RequestParam Map<String, String> name) { List<PatientProfileDto> list = new ArrayList<PatientProfileDto>(); ... PatientProfileDto patientProfileDto = mapToPatientProfileDto(mame); ... list = service.getPatient(patientProfileDto); return list; }


reemplace contentType: "application / x-www-form-urlencoded", por dataType: "text" ya que wildfly 11 no admite el tipo de contenido mencionado.