Swagger OpenApi 3.0 不允许 PUT 请求仅 POST 和 GET 工作
Posted
技术标签:
【中文标题】Swagger OpenApi 3.0 不允许 PUT 请求仅 POST 和 GET 工作【英文标题】:Swagger OpenApi 3.0 not allowing a PUT requests only POST and GET work 【发布时间】:2021-10-03 13:10:49 【问题描述】:我有一个 PUT 请求无法通过 OPENAPI 3.0 我遇到了 CORS 问题,但是有趣的是,如果我接受 SwaggerUI 构建的 CURL 请求并将其放入任何 CLI 中,它就可以完美运行。只有通过 SwaggerUI PUT 不起作用。 POST 和 GET 没问题。
获取失败。 可能的原因: CORS 网络故障 对于 CORS 请求,URL 方案必须是“http”或“https”。
如果我得到我的 JSON 文件定义,它的内容如下。我可以看到 PUT 不在“Access-Control-Allow-Methods”中,但我不知道如何添加它。
$ curl -I "http://192.168.2.120:8087/medic/ic-swagger.json" HTTP/1.1 200 正常 服务器:nginx 日期:格林威治标准时间 2021 年 7 月 27 日星期二 14:55:25 内容类型:application/json 内容长度:25275 最后修改时间:格林威治标准时间 2021 年 7 月 27 日星期二 14:54:22 连接:保持活动 ETag:“61001e1e-62bb” 到期:格林威治标准时间 2021 年 7 月 27 日星期二 14:55:24 缓存控制:无缓存 访问控制允许来源:* 访问控制允许方法:GET、POST、OPTIONS Access-Control-Allow-Headers:DNT、X-CustomHeader、Keep-Alive、User-Agent、X-Requested-With、If- 修改自、缓存控制、内容类型 接受范围:字节
下面的简单 PUT 请求
/user/login:
put:
tags: [GETTING STARTED]
summary: Log a user in.
description: Log a user in and get an Id.
requestBody:
required: true
content:
text/plain:
schema:
$ref: '#/components/schemas/loginBody'
responses:
'200':
description: Successful user login. RESULT will hold the new Id
content:
application/json:
schema:
$ref: '#/components/schemas/Login_response_1'
通过 POSTMAN 没问题,在标题中你发现:
Access-Control-Allow-Methods: POST, GET, PUT, UPDATE, OPTIONS, HEAD
Access-Control-Allow-Origin: *
任何帮助都将不胜感激。
【问题讨论】:
1) 浏览器开发工具的“控制台”选项卡中的完整错误消息是什么? 2) 无关评论:requestBody
中的内容类型应该是application/json
而不是text/plain
。
【参考方案1】:
好吧,我从一些旧代码中找到了它,但不记得为什么会这样或者它是否是正确的解决方案,如果有人可以解释一下,请。所以我发现如果我添加一个 OPTIONS REST 调用,那么一切都会完美运行。似乎预检去了那里并获得了 Access-Control-Allow-Origin ,然后允许调用通过。
@OPTIONS
@Path("user/login")
@Produces(MediaType.APPLICATION_JSON)
public Response optionsLogin()
Response.ResponseBuilder res =
Response.ok()
.header("Access-Control-Allow-Origin", "*")
.header("Access-Control-Allow-Credentials", "true")
.header("Access-Control-Allow-Methods", "POST, GET, PUT, UPDATE, OPTIONS, HEAD")
.header("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With");
return res.build();
【讨论】:
【参考方案2】:您是否使用某种广告拦截器?如果是,您可以尝试禁用它。
【讨论】:
以上是关于Swagger OpenApi 3.0 不允许 PUT 请求仅 POST 和 GET 工作的主要内容,如果未能解决你的问题,请参考以下文章
使用 Spring Security 启用 Swagger springdoc-openapi-ui (OpenAPI 3.0) - 无法访问 swagger-ui.html (401)
如何在 Gradle 中为 OpenAPI 3.0 使用 Swagger Codegen?