如何在 Swagger (OpenAPI) 中发布文件?

Posted

技术标签:

【中文标题】如何在 Swagger (OpenAPI) 中发布文件?【英文标题】:How to post files in Swagger (OpenAPI)? 【发布时间】:2013-01-05 11:56:29 【问题描述】:

我正在使用 Swagger 来记录我的 REST 服务。我的一项服务需要上传 CSV 文件。我在 JSON API 定义的 parameters 部分添加了以下内容:


       "name": "File",
       "description": "The file in zip format.",
       "paramType": "body",
       "required": true,
       "allowMultiple": false,
       "dataType": "file"

现在我在 Swagger UI 页面上看到了文件上传选项。但是当我选择一个文件并单击“试用”时,我收到以下错误:

NS_ERROR_XPC_BAD_OP_ON_WN_PROTO:对 jquery-1.8.0.min.js 中 WrappedNative 原型对象的非法操作(第 2 行)

页面正在持续处理,我没有得到任何响应。

有什么想法可能是错的吗?

【问题讨论】:

“file”后面不加最后一个逗号可以试试吗? @Soc : 请忽略那个逗号,这只是一个拼写错误。 也许您可以尝试通过以下方式进行调试:(也许使用更新的查询版本),使用非最小化版本的 jquery 并查看 JS 控制台(也许设置断点)并找到找出错误是如何产生的。也许您会获得更多有关导致问题的原因的信息。 【参考方案1】:

我正在使用 Open API v 3.0.3

这是我的 swagger.json 的样子:

"/media/upload": 
      "post": 
        "tags": ["Media"],
        "name": "Upload Media",
        "description": "Uploads a Media file to the server.",
        "requestBody": 
          "required": true,
          "content": 
            "multipart/form-data": 
              "schema": 
                "type": "object",
                "properties": 
                  "media": 
                    "type": "string",
                    "format": "base64"
                  
                
              
            
          
        
      
    

它是这样大摇大摆的:

【讨论】:

您是否从 aws api 网关开发人员门户中截取了上面的屏幕截图。即使我创建了类似的rest api,我也没有选择文件的选项。 这是来自我的本地机器【参考方案2】:

OpenAPI 规范 2.0

在 Swagger 2.0 (OpenAPI Specification 2.0) 中,使用表单参数 (in: formData) 并将 type 设置为 file。此外,操作的consumes 必须是multipart/form-data

  consumes:
    - multipart/form-data
  parameters:
    - name: file
      in: formData   # <-----
      description: The uploaded file data
      required: true
      type: file     # <-----

OpenAPI 规范 3.0

在OpenAPI Specification 3.0 中,文件被定义为二进制字符串,即type: string + format: binary(或format: byte,取决于用例)。文件输入/输出内容的描述与任何其他模式类型的语义相同(与 OpenAPI 2.0 不同):

多部分请求,单个文件:

requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          # 'file' will be the field name in this multipart request
          file:
            type: string
            format: binary

多部分请求,文件数组(在 Swagger UI 3.26.0+ 和 Swagger Editor 3.10.0+ 中支持):

requestBody:
  content:
    multipart/form-data:
      schema:
        type: object
        properties:
          # The property name 'file' will be used for all files.
          file:
            type: array
            items:
              type: string
              format: binary

直接POST/PUT文件(请求体为文件内容):

requestBody:
  content:
    application/octet-stream:
      # any media type is accepted, functionally equivalent to `*/*`
      schema:
        # a binary file of any type
        type: string
        format: binary

注意:语义与其他 OpenAPI 3.0 模式类型相同:

# content transferred in binary (octet-stream):
schema:
  type: string
  format: binary

更多信息:

Considerations for File Uploads Special Considerations for multipart Content File Upload 和 Multipart Requests

【讨论】:

如何访问节点js控制器中的文件?比如如果我的文件名为filedata,那么我的流内变量应该初始化为req.swagger.params.filedata.value?这给了我一个错误。 您能否解释一下为什么招摇的 OpenAPI 规范没有指出这一点? swagger.io/specification/#considerations-for-file-uploads-61 @AmazingTurtle 你链接到 OpenAPI 规范 3.0;我已更新答案以包含 OpenAPI 规范 3.0。 你能解释更多吗,例如:当我使用 Django REST 框架时,应该修改哪个代码模块?谢谢!【参考方案3】:

我的似乎可以使用

 "paramType": "formData",
 "dataType": "file",

【讨论】:

此答案适用于旧版本的 Swagger 规范(1.x?),不适用于 OpenAPI 2.0 / OpenAPI 3.0。请参阅mstrthealias' answer。【参考方案4】:

我终于找到了答案,实际上之前不支持文件上传,现在他们更新了swagger-ui.js文件。您需要用新的替换旧的,还必须在参数下为特定参数定义这些属性:

 "paramType": "body",
 "dataType": "file",

【讨论】:

我怎样才能将文件与其他数据一起添加(比如带有某些字段的文件?) @Win 你找到解决问题的方法了吗? 此答案适用于旧版本的 Swagger 规范(1.x?),不适用于 OpenAPI 2.0 / OpenAPI 3.0。请参阅mstrthealias' answer。

以上是关于如何在 Swagger (OpenAPI) 中发布文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 OpenAPI / Swagger 中递归引用封闭类型定义?

如何使用 Swagger\OpenAPI 记录 GraphQL?

如何在 Apache Camels RouteBuilder.restConfiguration() 中添加 OpenApi/Swagger securitySchemes?

如何使用 OpenApi 自定义 swagger-ui.html url

如何在 OpenAPI (Swagger) 中为相同的 HTTP 状态代码定义不同的响应?

如何使用 openapi-ui 和承载令牌(jwt)在 swagger-ui 中激活授权按钮?