webentwicklung-frage-antwort-db.com.de

Swagger TypeError: Fehler beim Ausführen des 'Abrufs' für 'Fenster': Die Anforderung mit der Methode GET/HEAD kann keinen Hauptteil haben

Ich habe Swagger meiner Spring Boot 2-Anwendung hinzugefügt:

Dies ist meine Swagger-Konfiguration:

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

}

Dies ist die Abhängigkeit von 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>

Wenn ich versuche, zum Beispiel http: // localhost: 8080/api/actu/auditevents aufzurufen, schlägt der folgende Fehler fehl:

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

enter image description here

Was mache ich falsch und wie kann ich das beheben?

9
alexanoid

Die Fehlermeldung sagt eigentlich, was das Problem ist. Sie buchen Daten mit curl mit der Option -d, während Sie versuchen, GET zu verwenden.

Wenn Sie die Option -d verwenden, führt curl POST aus.
Wenn Sie die -X GET - Option verwenden, wird curl GET .

Die Methode HTTP GET dient zum Anfordern einer Darstellung der angegebenen Ressource. Anfragen, die GET verwenden, sollten nur Daten abrufen und können daher keinen Text enthalten.

Weitere Informationen zu GET vs POST

3
Boris

ich bin auf dieses Problem gestoßen. So habe ich es gelöst:

ich hatte eine Methode wie diese:

[HttpGet]
public IEnumerable<MyObject> Get(MyObject dto)
{
      ...
}

und ich bekam den Fehler. Ich glaube, Swagger UI interpretiert die Get-Parameter als FromBody, so verwendet es die curl -d Flagge. Ich habe den [FromQuery] -Dekorator hinzugefügt und das Problem wurde behoben:

[HttpGet]
public IEnumerable<MyObject> Get([FromQuery]MyObject dto)
{
      ...
}

dies ändert auch die Benutzeroberfläche für diese Methode. Anstatt json anzugeben, haben Sie ein Formularfeld für jede Eigenschaft des Parameterobjekts.

Tom

1
ironfist

Ich habe auch den gleichen Fehler auf der Swagger-Benutzeroberfläche erhalten. Mein Problem war, dass ich die Api-Methode fälschlicherweise als GET markiert habe und Daten im Anforderungstext senden. Sobald ich die Annotation @GET in @POST geändert habe, wurde das Problem behoben. 

0

Übergeben Sie den Methodentyp nicht in der Get-Methode.

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"}})

Dies wird nur für die Buchung verwendet, wenn wir keinen Methodentypknoten zuweisen, der automatisch als Get-Methode betrachtet wird

Ich hatte dasselbe Problem mit meiner .net Core 2.0-Lösung und der GET-Methode, bei der die Element-ID als Headerschlüssel verwendet wird, oder anhand von Parametern im Hauptteil danach gesucht wird. Dies ist nicht der beste Weg zur Implementierung, aber es ist eine Art Sonderfall.

Wie in dieser Diskussion erwähnt. Die HTTP-Spezifikation verbietet nicht die Verwendung von body für ein GET, aber swagger implementiert dies nicht so. Auch wenn es APIs gibt, die gut mit body in GET Requests funktionieren. 

Darüber hinaus fügt das Swagger-Frontend dieses Body-Objekt der Anfrage hinzu, auch wenn es sich um ein null/undefined/empty-Objekt handelt. Es ist -d "body_content_here" Parameter. Wenn ich also nur nach der ID suche und der Körper leer ist, sendet ich immer noch ein leeres Objekt (-d "{}") und wirft den erwähnten Fehler ab.

Mögliche Lösungen:

  • Beginnen Sie mit der Postman App für diese Anfrage - es wird gut funktionieren. Geprüft.

  • Ziehen Sie in Betracht, eine fortgeschrittenere GET-Anforderung (wie eine Suche mit Kriterien) auf die unabhängige Methode POST zu verschieben

  • Verwenden Sie die von Swagger generierte CURL-Anforderung ohne den Parameter -d 

0
chotkos

Möglicherweise liegt das Problem bei der Zuordnung der Methode. Stellen Sie sicher, dass Sie __. @RequestMapping(value = "/<your path>" , method = RequestMethod.POST) Verwenden, und geben Sie die Daten als body mit @RequestBody

0
MichaelK