web-dev-qa-db-ja.com

Swagger TypeError: 'Window'で 'fetch'を実行できませんでした:GET / HEADメソッドでのリクエストにはボディを含めることができません

Spring Boot 2アプリケーションにSwaggerを追加しました。

これは私の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
    }

}

これは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>

たとえば http:// localhost:8080/api/actuator/auditevents を呼び出そうとすると、次のエラーで失敗します。

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

enter image description here

私は何を間違っていますか、それを修正する方法は?

21
alexanoid

エラーメッセージには、実際に問題の内容が示されています。 curl を使用してデータを投稿するには、-dオプションを使用してGET

-dオプションを使用すると、curlは POST を実行します。
-X GETオプションを使用すると、curlは GET を実行します。

HTTP GETメソッドは、指定されたリソースの表現を要求するためのものです。 GETを使用するリクエストは、データのみを取得する必要があるため、本文を持つことはできません。

GET vs POST の詳細

7
Boris

.net core 2.0ソリューションと、要素キーをヘッダーキーとして使用するGETメソッド、または本文のパラメーターで検索するGETメソッドでも同じ問題が発生しました。これは実装するのに最適な方法ではありませんが、特殊なケースです。

this で説明したとおり。 HTTP仕様では、GETでbodyを使用することは禁止されていませんが、swaggerはこのように実装していません。 GETリクエストの本文で正常に機能するAPIがあったとしても。

さらに、Swaggerフロントエンドは、null/undefined/emptyオブジェクトであっても、このbodyオブジェクトをリクエストに追加します。 -d "body_content_here"パラメーターです。したがって、私の場合、idでのみ検索し、本文が空の場合、空のオブジェクト(-d "{}")を送信し、前述のエラーをスローします。

可能な解決策:

  • このリクエストに郵便配達アプリを使い始めてください-それはうまく動作します。テスト済み。

  • より高度なGETリクエスト(条件付き検索など)を独立したPOSTメソッドに移動することを検討してください

  • -dパラメーターなしでswaggerで生成されたCURLリクエストリクエストを使用する

3
chotkos

私はこの問題に遭遇しました。ここに私がそれを解決した方法があります:

私はこのような方法がありました:

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

そして、私はエラーを取得していました。 Swagger UIはGetパラメーターをFromBodyとして解釈しているため、curl -dフラグを使用していると思います。 [FromQuery]デコレータを追加し、問題は解決しました。

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

これにより、そのメソッドのUIエクスペリエンスも変更されます。 jsonを提供する代わりに、パラメーターオブジェクトの各プロパティのフォームフィールドがあります。

トム

1
ironfist

Swagger UIでも同じエラーが発生しました。私の問題は、Apiメソッドを誤ってGETとしてマークし、リクエスト本文でデータを送信したことです。アノテーション@GETを@POSTに変更すると、問題は解決しました。

0

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

これは投稿にのみ使用されます。Getメソッドと自動的に見なされるメソッドタイプノードを割り当てない場合

たぶん問題はメソッドのマッピングにあるので、必ず@RequestMapping(value = "/<your path>" , method = RequestMethod.POST)を使用し、@RequestBodyで本文としてデータを入れてください

0
MichaelK