我已将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.
我做错了什么以及如何解决?
答案 0 :(得分:5)
错误消息实际上说明了问题所在。在尝试使用 GET 时,使用 -d 选项使用curl发布数据。
如果使用 -d 选项,curl将执行POST 如果您使用 -X GET 选项,curl将执行GET。
HTTP GET 方法用于请求指定资源的表示。使用 GET 的请求应该只检索数据,因此不能有正文。
的更多信息答案 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
内的架构中定义的属性一样多的行