Swagger TypeError:无法在'Window'上执行'fetch':使用GET / HEAD方法的请求不能有正文

问题描述 投票:16回答:5

我已将Swagger添加到Spring Boot 2应用程序中:

这是我的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

我做错了什么以及如何解决?

spring-boot swagger swagger-ui swagger-2.0
5个回答
6
投票

错误消息实际上说明了问题所在。在尝试使用GET时,使用-d选项使用curl发布数据。

如果使用-d选项,curl将执行POST。 如果使用-X GET选项curl将执行GET

HTTP GET方法用于请求指定资源的表示。使用GET的请求应该只检索数据,因此不能有正文。

有关GET vs POST的更多信息


2
投票

我的.net核心2.0解决方案和GET方法遇到同样的问题,它将元素id作为标题键或通过body中的参数搜索它。这不是最好的实施方式,但它是一种特殊情况。

正如this讨论中提到的那样。 HTTP规范并不禁止在GET上使用body,但是swagger并没有像这样实现它。即使在GET请求中有适用于body的API也是如此。

更重要的是,即使它是null / undefined / empty对象,swagner前端也会将此body对象添加到请求中。它是-d“body_content_here”参数。所以在我的情况下,当我只搜索id和body是空的时,它仍然发送空对象(-d“{}”)并抛出提到的错误。

可能的解决方案:

  • 开始使用邮递员应用程序为此请求 - 它将正常工作。测试。
  • 考虑将更高级的GET请求(例如使用条件搜索)移动到独立的POST方法
  • 使用swagger生成的CURL请求请求而不使用-d参数

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

这仅用于post,如果我们不指定任何方法类型节点自动被视为Get方法


0
投票

也许问题在于方法的映射,请确保使用 @RequestMapping(value = "/<your path>" , method = RequestMethod.POST) 并将数据作为正文与@RequestBody一起使用


0
投票

我在Swagger UI上也遇到了同样的错误。我的问题是我错误地将Api方法标记为GET并在请求正文中发送数据。一旦我将注释@GET更改为@POST问题就解决了。

© www.soinside.com 2019 - 2024. All rights reserved.