当前位置: 首页 > 知识库问答 >
问题:

Swagger TypeError:无法在“窗口”上执行“获取”:使用GET/HEAD方法的请求不能有正文

施永宁
2023-03-14

我在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.

我做错了什么?如何修复?

共有3个答案

方博
2023-03-14

我的大脑也有同样的问题。net core 2.0解决方案和GET方法,该方法将元素id作为头键或通过正文中的参数进行搜索。这不是最好的实现方式,但这是一种特殊情况。

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

更重要的是,大摇大摆的前端将这个body对象添加到请求中,即使它是空/未定义/空对象。它是-d"body_content_here"参数。所以在我的例子中,当我只按id搜索并且body为空时,它仍然发送空对象(-d "{}") 并抛出提到的错误。

可能的解决方案:

>

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

使用无-d参数的swagger生成的CURL请求

施文彬
2023-03-14

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

我有一个这样的方法:

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

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

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

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

华永新
2023-03-14

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

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

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

有关GET vs POST的更多信息

 类似资料:
  • 我用fetch调用谷歌时区。但是当我试图将lat/lng和timestamp作为主体参数传入时,出现了一个错误。 错误:无法在“窗口”上执行“提取”:带有GET/HEAD方法的请求不能有正文 这是我的代码。谷歌允许它以这种方式命名吗? 这样,所有的url字符串,工作正常! https://maps.googleapis.com/maps/api/timezone/json?location=39.

  • 问题内容: 我有这个API: 但是in始终返回null。我可以将@GET更改为@POST,并且可以使用,但是我并没有真正执行创建或更新操作,因此使用post似乎很奇怪。 有没有办法通过球衣的GET请求获得身体? 问题答案: TL; DR 正确的解决方案是使用POST。 “我可以将@GET更改为@POST,并且可以,但是我并没有真正执行创建或更新操作,因此使用post似乎很奇怪” 为什么这么奇怪?P

  • 当用户按下ctrl键时,我试图在Chrome中保存HTML文件,但Chrome崩溃了。 (我只想下载HTML文件的源代码) 我读到它发生是因为我的文件比1.99M大... 在第一次尝试中(在我知道Chrome崩溃之前): 第二次尝试,在我读到崩溃后,我使用了: 这里我得到了错误: 我不知道,但我读到我需要将我的字符串编码为base 64:如何在JavaScript中将字符串编码为Base64? 有

  • 问题内容: 我正在尝试解析使用Python Requests库完成的HEAD请求的结果,但似乎无法访问响应内容。 根据文档,我应该能够从request.Response.text访问内容。这对GET请求对我来说效果很好,但对HEAD请求返回None。 GET请求(有效) 内容= HEAD请求(无内容) 内容= 编辑 好的,我很快就从答案中意识到,HEAD请求不应返回仅内容标头。但这是否意味着,要访

  • 我得到了405请求方法'GET'在app engine的文件上传过程中不受支持,但在我的本地沙箱中相同的代码运行正常 看起来像bbloservice回调请求应该是POST类型后POST/_ah/上载/...但是当我用Firebug看的时候,它是一个带有以下头的GET请求,我确实在@Controller类中定义了请求处理程序,该类具有方法类型请求方法。POST 标题 响应Headersview源允许