我已将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.
我做错了什么以及如何解决?
错误消息实际上说明了问题所在。在尝试使用GET时,使用-d选项使用curl发布数据。
如果使用-d选项,curl将执行POST。 如果使用-X GET选项curl将执行GET。
HTTP GET方法用于请求指定资源的表示。使用GET的请求应该只检索数据,因此不能有正文。
有关GET vs POST的更多信息
我的.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方法中传递方法类型。
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方法
也许问题在于方法的映射,请确保使用
@RequestMapping(value = "/<your path>" , method = RequestMethod.POST)
并将数据作为正文与@RequestBody
一起使用
我在Swagger UI上也遇到了同样的错误。我的问题是我错误地将Api方法标记为GET并在请求正文中发送数据。一旦我将注释@GET更改为@POST问题就解决了。