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 不起作用。 POSTGET 没问题。

获取失败。 可能的原因: 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)

如何从 OpenAPI 3.0 生成 PDF 或标记?

如何在 Gradle 中为 OpenAPI 3.0 使用 Swagger Codegen?

Java - 如何直接从 openapi 3.0 规范生成 Swagger UI

OpenAPI-Swagger3-介绍使用

在 Swagger openAPI 注释中发出“授权:承载 <token>”