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

时间:2018-02-12 14:56:20

标签: spring-boot swagger swagger-ui 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
    }

}

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

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

11 个答案:

答案 0 :(得分:5)

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

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

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

有关GET vs POST

的更多信息

答案 1 :(得分:1)

.net core 2.0解决方案和GET方法都存在相同的问题,该方法将元素id作为标头关键字或通过主体中的参数进行搜索。那不是最佳的实现方式,而是一种特殊情况。

this讨论中所述。 HTTP规范不禁止在GET上使用body,但是大摇大摆并没有实现它。即使有些API与GET Request中的body配合良好。

此外,招摇前端将这个主体对象添加到请求中,即使它是null / undefined / empty对象。它是-d“ body_content_here”参数。因此,在我的情况下,当我仅按id搜索且body为空时,它仍会发送空对象(-d“ {}”)并抛出所提到的错误。

可能的解决方案:

  • 开始针对此请求使用邮递员应用-可以正常运行。经过测试。

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

  • 使用不带-d参数的大张旗鼓的CURL请求请求

答案 2 :(得分:1)

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

我有这样的方法:

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

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

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

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

汤姆

答案 3 :(得分:1)

查看大范围的异常/错误消息,似乎您正在使用一组输入正文调用Get方法。根据GET方法的文档,不接受任何正文。您需要将 GET方法更改为POST方法。应该可以。

答案 4 :(得分: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方法的方法类型节点

答案 5 :(得分:0)

也许问题在于方法的映射,请确保使用 @RequestMapping(value = "/<your path>" , method = RequestMethod.POST) 并使用@RequestBody

将数据作为正文

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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

$@

答案 8 :(得分:0)

因为您将GET http方法与body一起使用。 如果您想拥有Json正文等,则需要使用POST http方法, 例如,在您的控制器类中,方法的顶部:

$comment

不带主体使用GET。

答案 9 :(得分:0)

在方法输入中使用 [FromQuery] 传递参数

答案 10 :(得分:0)

我在 Ruby On Rails 应用程序上尝试使用 Swagger UI 时遇到了这个问题。我通过更改 curl 命令上的信息容器来修复它。这是一个示例行:

parameter name: :body, in: :body, schema: {'$ref' => '#/definitions/ActivitiesFilter'}, required: true

进入

parameter name: :attribute_name1, in: :query, required: true
parameter name: :attribute_name2, in: :query, required: true
parameter name: :attribute_name3, in: :query, required: true

请注意,您必须添加与在 swagger_helper 内的架构中定义的属性一样多的行