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.