web-dev-qa-db-fra.com

Une requête Http Post avec le type de contenu application/x-www-form-urlencoded ne fonctionne pas au printemps

Je suis nouveau pour le printemps, je suis en train de faire HTTP POST demande application/x-www-formulaire-url codé mais quand je garde cela dans mes en-têtes, puis le printemps ne le reconnaît pas et dit 415 Unsupported Media Type.__ x-www-form-urlencoded

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded' non pris en charge

Quelqu'un peut-il savoir comment le résoudre? s'il vous plaît commentez-moi.

Un exemple de mon contrôleur est:

@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;
}
7
Rajesh

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 utiliser ce fichier .__, nous devons supprimer l’annotation @RequestBody .

Ensuite, essayez ce qui suit:

@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;
}

Notez que l’annotation a été supprimée @RequestBody

30
Douglas Ribeiro

vous devez remplacer @RequestBody par @RequestParam et ne pas accepter les paramètres avec une entité Java.

Ensuite, votre contrôleur est probablement comme ça:

@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;
}
2
Djack

Le plus simple est de définir le type de contenu de votre demande ajax sur "application/json; charset = utf-8", puis de laisser votre méthode api utiliser json. Comme ça 

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){

Je suppose que le problème est que spring boot pose des problèmes lors de la soumission de données de formulaire qui ne sont pas JSON via une requête ajax ..__ Remarque: le type de contenu par défaut pour ajax est "application/x-www-form-urlencoded"

0
Eshiett Oto-obong

Vous devez indiquer à Spring quel type de contenu d'entrée est pris en charge par votre service. Vous pouvez le faire avec l'élément d'annotation "consommé" qui correspond à l'en-tête "Type de contenu" de votre demande.

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

Il serait utile que vous publiiez votre code.

0
SpeaksBinary