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.
私は何を間違っていますか、それを修正する方法は?
エラーメッセージには、実際に問題の内容が示されています。 curl を使用してデータを投稿するには、-dオプションを使用してGET。
-dオプションを使用すると、curlは POST を実行します。
-X GETオプションを使用すると、curlは GET を実行します。
HTTP GETメソッドは、指定されたリソースの表現を要求するためのものです。 GETを使用するリクエストは、データのみを取得する必要があるため、本文を持つことはできません。
GET vs POST の詳細
.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リクエストリクエストを使用する
私はこの問題に遭遇しました。ここに私がそれを解決した方法があります:
私はこのような方法がありました:
[HttpGet]
public IEnumerable<MyObject> Get(MyObject dto)
{
...
}
そして、私はエラーを取得していました。 Swagger UIはGetパラメーターをFromBodyとして解釈しているため、curl -d
フラグを使用していると思います。 [FromQuery]デコレータを追加し、問題は解決しました。
[HttpGet]
public IEnumerable<MyObject> Get([FromQuery]MyObject dto)
{
...
}
これにより、そのメソッドのUIエクスペリエンスも変更されます。 jsonを提供する代わりに、パラメーターオブジェクトの各プロパティのフォームフィールドがあります。
トム
Swagger UIでも同じエラーが発生しました。私の問題は、Apiメソッドを誤ってGETとしてマークし、リクエスト本文でデータを送信したことです。アノテーション@GETを@POSTに変更すると、問題は解決しました。
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
で本文としてデータを入れてください