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

ale*_*oid 23 swagger swagger-ui spring-boot swagger-2.0

我已将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
    }

}
Run Code Online (Sandbox Code Playgroud)

这是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>
Run Code Online (Sandbox Code Playgroud)

当我尝试调用例如http:// localhost:8080/api/actuator/auditevents时, 它失败并出现以下错误:

TypeError: Failed to execute 'fetch' on 'Window': Request with GET/HEAD method cannot have body.
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

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

iro*_*ist 19

我遇到了这个问题。这是我解决它的方法:

我有一个这样的方法:

[HttpGet]
public IEnumerable<MyObject> Get(MyObject dto)
{
      ...
}
Run Code Online (Sandbox Code Playgroud)

我得到了错误。我相信 swagger UI 将 Get 参数解释为 FromBody,因此它使用了curl -d标志。我添加了 [FromQuery] 装饰器,问题解决了:

[HttpGet]
public IEnumerable<MyObject> Get([FromQuery]MyObject dto)
{
      ...
}
Run Code Online (Sandbox Code Playgroud)

仅供参考,这也改变了该方法的 UI 体验。您将为参数对象的每个属性提供一个表单字段,而不是提供 json。


Bor*_*ris 9

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

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

HTTP GET方法是请求指定资源的表示。使用GET的请求应仅检索数据,因此不能具有主体。

GET vs POST的更多信息

  • 但他使用的是 swagger ui,而不是 curl (6认同)
  • 感谢您的回答。我没有直接使用卷曲。这是Swagger 2.8.0的一些内部输出。顺便说一句-我将Swagger版本降级到2.7.0,问题不再存在。Swagger 2.8.0可能有什么问题? (5认同)
  • @Boris在您提供的链接中并没有说不可能同时使用 GET 和 body。HTTP 规范允许这样做,因此本主题是关于 swagger 问题(swagger 没有正确实现 http) (4认同)
  • @Boris 我不同意你的回答。因为 `curl -d` 也称为 `--data` 标志并不关心,是的,您可以将数据传递给它,是的,它甚至可以在 GET 请求上工​​作,例如: `curl -X GET "https://veggies. com/carrots" -H "内容类型:application/json" -d "{\"bunny_id\": 22 }"`. 非常适合我,因为 API 支持它,“curl”也支持它!现在,至于它是否常见或者我们是否应该这样做的问题是另一个故事了。无论如何,“curl”都没有问题。我尝试过这个。所以问题一定是 swagger 的 `fetch` 函数/方法而不是 `curl -d` (3认同)
  • 我明白了,也许 [this](https://github.com/springfox/springfox/issues/1781) 是 Swagger 的问题? (2认同)

cho*_*kos 7

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

正如本次讨论中提到的。HTTP 规范不禁止在 GET 上使用 body,但 swagger 并没有像这样实现它。即使在 GET 请求中存在与 body 配合良好的 API。

更重要的是,即使它是空/未定义/空对象,swagger 前端也会将此主体对象添加到请求中。它是 -d "body_content_here" 参数。所以在我的情况下,当我只按 id 搜索并且正文为空时,它仍然发送空对象(-d "{}")并抛出提到的错误。

可能的解决方案:

  • 开始为此请求使用邮递员应用程序 - 它将正常工作。测试。

  • 考虑将更高级的 GET 请求(如使用条件搜索)移动到独立的 POST 方法

  • 使用不带 -d 参数的 swagger 生成的 CURL 请求请求


小智 5

不要在 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"}})
Run Code Online (Sandbox Code Playgroud)

这仅用于发布,如果我们不分配任何方法类型节点,则自动视为 Get 方法

  • 欢迎来到 Stackoverflow。尝试按照[此处](https://stackoverflow.com/help/formatting)所述正确设置代码格式 (3认同)

小智 5

为了避免此错误,请务必使用 @RequestParam 注释控制器中的参数,例如

@GetMapping("/get")
public Response getData(@RequestParam String param)
Run Code Online (Sandbox Code Playgroud)