web-dev-qa-db-fra.com

Statut HTTP 415 - l'entité de la demande est dans un format non pris en charge

Je travaille sur un service Web reposant sur Java. Je l’ai obtenu pour la requête GET, mais la requête POST ne fonctionne pas. Ma classe de contrôleur est RestController. J'ai fait ceci jusqu'à présent:

@RequestMapping(value = "/api/signup", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
public long signUp(@ModelAttribute ApiMemberModel apiMember) {
    memberService = new MemberDetailsService();
    Member m = memberService.createMember(apiMember.getUsername(), apiMember.getPassword(), apiMember.getEmail(), "");
    return m.getId();
}

Également essayé RequestBody au lieu de ModelAttribute.

J'utilise Postman extension pour l'envoi d'une demande POST. Par exemple:

{
    "username": "asd",
    "password": "sfsdg",
    "email": "[email protected]"
}

Mais je reçois l'erreur:

description The server refused this request because the request entity is in a format not supported by the requested resource for the requested method.

Qu'est-ce que je fais mal? La classe de modèle est:

 public class ApiMemberModel {
    private String username;
    private String password;
    private String email;

    public ApiMemberModel(String username, String password, String email) {
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}
17
nope

Je parie que l'appel de Postman n'inclut pas Content-Type: application/json.

HTTP 415 signifie que le serveur ne comprend pas le format de média de la demande. Dans votre contrôleur, vous indiquez qu'il accepte JSON, mais vous n'avez pas indiqué si la requête indiquait que le corps avait ce format. Le fait que les données soient au format JSON ne signifie pas que le serveur va les reconnaître, vous devez l'indiquer dans l'en-tête Content-Type.

40
vtortola

Spring fournit plusieurs convertisseurs HttpMessageConverters par défaut, qui seront utilisés pour la conversion, en fonction de la présence de certaines bibliothèques dans le chemin de classe du projet.

Par exemple, si l'en-tête de demande Content-Type de requête correspond à application/json ou application/xml, cela signifie que le corps POST contient json ou XML [formats populaires], et si la bibliothèque Jackson est trouvée dans votre chemin de classe, Spring déléguera la conversion à MappingJackson2HttpMessageConverter [pour json] ou à MappingJackson2XmlHttpMessageConverter [pour xml].

Pour déclarer une dépendance à la bibliothèque Jackson (jackson-databind), incluez la dépendance suivante dans votre pom.xml

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>${jackson.version}</version>
</dependency>
3
Pradeep

Moi aussi j'ai eu le même problème. Ajoutez l’en-tête Content Type à application/xml (ou quel que soit le service attendu) au facteur.

0
ABHIJITH GM

ajoutez une ligne "axée sur les annotations" à votre fichier XML ou ajoutez un type de contenu comme application/json 

0
BHARATHWAJ

J'ai un peu honte d'écrire ceci, mais j'ai oublié de mettre l'attribut enctype="multipart/form-data" dans la balise de formulaire:

<form action="rest/upload_function_path" method="post" enctype="multipart/form-data">
<!-- this thing right  --------------------------------^ there! -->
    <p>
    Your file is: <input type="file" name="fajl" />
    </p>
    <input type="submit" value="Upload It" />
</form>

C’est une jolie erreur, mais aussi celle qui a pris du temps à se réaliser.

0
Casper