web-dev-qa-db-fra.com

Swagger TypeError: Echec de l'exécution de 'l'extraction' sur 'Fenêtre': la requête avec la méthode GET/HEAD ne peut pas avoir de corps

J'ai ajouté Swagger à mon application Spring Boot 2:

Ceci est ma config Swagger:

@Configuration
@EnableSwagger2
public class SwaggerConfig {

    @Bean
    public Docket api() {
        // @formatter:off
        return new Docket(DocumentationType.SWAGGER_2)  
                .select()                                  
                .apis(RequestHandlerSelectors.any())              
                .paths(PathSelectors.any())                          
                .build();
        // @formatter:on
    }

}

C'est la dépendance Maven:

    <!-- Swagger2 -->
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger2</artifactId>
        <version>2.8.0</version>
    </dependency>
    <dependency>
        <groupId>io.springfox</groupId>
        <artifactId>springfox-swagger-ui</artifactId>
        <version>2.8.0</version>
    </dependency>

Lorsque j'essaie d'invoquer par exemple http: // localhost: 8080/api/actuator/auditevents il échoue avec l'erreur suivante:

TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.

 enter image description here

Qu'est-ce que je fais mal et comment y remédier?

9
alexanoid

Le message d'erreur indique en réalité le problème. Vous publiez des données avec curl en utilisant l’option -d lorsque vous essayez d’utiliser GET.

Si vous utilisez l'option -d, curl fera POST .
Si vous utilisez -X, GET option curl fera GET .

La méthode HTTP GET permet de demander une représentation de la ressource spécifiée. Les requêtes utilisant GET doivent uniquement récupérer des données et ne peuvent donc pas avoir de corps.

Plus d'infos sur GET vs POST

3
Boris

J'ai aussi eu la même erreur sur l'interface utilisateur Swagger. Mon problème était que j'avais marqué par erreur la méthode Api comme étant GET et envoyé des données dans le corps de la demande. Une fois que j'ai modifié le commentaire d'annotation @GET en @POST, le problème a été résolu. 

0
Tharindu Jayasuriya

Ne passez pas le type de méthode dans la méthode Get.

let res = await fetch("http://localhost:8080/employee_async",{
                method: "POST",
                body:JSON.stringify(data),
                mode:"cors",
                headers: {"Content-type":"application/json;charset=utf-8"}})

Ceci est utilisé uniquement pour la publication. Si nous n'affectons aucun type de nœud de méthode automatiquement considéré comme une méthode Get

0

J'ai eu le même problème avec ma solution .net core 2.0 et ma méthode GET qui prend l'élément id comme clé d'en-tête ou la recherche par paramètres dans le corps. Ce n'est pas la meilleure façon de mettre en œuvre, mais c'est un peu un cas particulier.

Comme mentionné dans this discussion. La spécification HTTP n'interdit pas l'utilisation de body sur un GET, mais swagger ne l'implémente pas comme ça. Même si certaines API fonctionnent correctement avec body dans les requêtes GET. 

De plus, l'interface swagger ajoute cet objet body à request même s'il s'agit d'un objet null/indéfini/vide. C'est le paramètre -d "body_content_here". Donc, dans mon cas, lorsque je recherche uniquement par identifiant et que le corps est vide, il envoie toujours un objet vide (-d "{}") et renvoie l'erreur mentionnée.

Solutions possibles:

  • Commencez à utiliser l'application Postman pour cette demande - cela fonctionnera correctement. Testé.

  • Envisagez de déplacer une demande GET plus avancée (comme une recherche avec des critères) vers la méthode indépendante POST.

  • Utiliser la demande de requête CURL générée par swagger sans paramètre -d 

0
chotkos

Le problème vient peut-être du mappage de la méthode. Assurez-vous d’utiliser @RequestMapping(value = "/<your path>" , method = RequestMethod.POST) Et placez les données en tant que corps avec @RequestBody.

0
MichaelK