首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >遵循JSON和rswag

遵循JSON和rswag
EN

Stack Overflow用户
提问于 2020-02-04 15:46:48
回答 2查看 2.8K关注 0票数 3

我正在使用罗塞格来测试一个相当常见的RubyOnRails 阿皮应用程序,但我无法找到一个非常常见的情况,即将文件上传到端点。

端点期望在请求体中使用包含二进制文件的data属性,并且我无法使用正确的参数来生成一个请求。

代码语言:javascript
复制
  path '/documents' do
    post 'Creates a document' do
      tags 'Documents'
      consumes 'multipart/form-data'
      produces 'application/vnd.api+json'

      parameter name: 'data',
                description: 'Whatever',
                attributes: {
                  schema: {
                    type: :object,
                    properties: {
                      file: { type: :binary },
                    },
                  },
                }

      response '201', 'success' do
        let(:data) do
          {
            attributes: {
              file: Rack::Test::UploadedFile.new($REALARGS),
            },
          }
        end

        schema "$ref": '#/definitions/post_document_responses/201'

        run_test! do |_example|
          # ACTUAL TEST
        end
      end
    end
  end

还有一些其他更简单的参数(例如授权)是正确生成的,我确信rswag是正确的。我看到的请求没有参数,我可以删除data参数,没有任何更改。我尝试了上百万次组合,结果总是一样,我不知道发生了什么。

控制器期望的paramsdata[attributes][file]

有谁可以帮我?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-06 15:28:54

parameter块需要指定插入的位置。有一个示例规范,在这里我找到了一个对:formData的引用,它必须被设置(也就是说,您不能使用:body,它只发送一个空请求)。

经过一段时间后,我设法让您的示例使用表单数据中的嵌套属性:

代码语言:javascript
复制
path '/documents' do
  post 'Creates a document' do
    tags 'Documents'
    consumes 'multipart/form-data'
    produces 'application/vnd.api+json'

    parameter name: 'data[attributes][file]',
              description: 'Whatever',
              in: :formData,
              attributes: {
                schema: {
                  type: :object,
                  properties: {
                    file: { type: :binary },
                  },
                },
              }

    response '201', 'success' do
      let(:"data[attributes][file]") { Rack::Test::UploadedFile.new(Rails.root.join("spec/requests/api/v1/documents_post_spec.rb")) }
      end

      schema "$ref": '#/definitions/post_document_responses/201'

      run_test! do |_example|
        # ACTUAL TEST
      end
    end
  end
end
票数 4
EN

Stack Overflow用户

发布于 2021-09-09 07:55:28

如果您需要发送一个带有文件的对象数组,您可以这样做:

代码语言:javascript
复制
parameter name: 'documents', in: :formData, type: :array, required: true

let(:documents) do
  [
    {
     file: file_1,
     name: '...' 
    },
    {
     file: file_2,
     name: '...'
    }
  ]
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60060942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档