使用 rswag 关注 JSON Api
Following JSON Api with rswag
我正在使用 rswag to test a rather common RubyOnRails JSON Api 应用程序,但我无法找出将文件上传到端点的相当常见的情况。
端点需要请求正文中通常的 data
属性和包含二进制文件的 file
属性,我无法让 rswag 生成具有正确参数的请求。
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
参数并且没有任何变化。我已经尝试了一百万种组合,结果总是一样,我不知道发生了什么。
控制器期望的 params
是 data[attributes][file]
。
谁能帮帮我?
parameter
块需要指定将插入的位置。有一个 example spec,我在其中找到了对 :formData
的引用,事实证明必须设置 (即您不能使用 :body
,它只是发送一个空请求)。
经过一番尝试后,我设法让您的示例使用表单数据中的嵌套属性:
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
如果您需要发送带有文件的对象数组,您可以这样做:
parameter name: 'documents', in: :formData, type: :array, required: true
let(:documents) do
[
{
file: file_1,
name: '...'
},
{
file: file_2,
name: '...'
}
]
end
我正在使用 rswag to test a rather common RubyOnRails JSON Api 应用程序,但我无法找出将文件上传到端点的相当常见的情况。
端点需要请求正文中通常的 data
属性和包含二进制文件的 file
属性,我无法让 rswag 生成具有正确参数的请求。
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
参数并且没有任何变化。我已经尝试了一百万种组合,结果总是一样,我不知道发生了什么。
控制器期望的 params
是 data[attributes][file]
。
谁能帮帮我?
parameter
块需要指定将插入的位置。有一个 example spec,我在其中找到了对 :formData
的引用,事实证明必须设置 (即您不能使用 :body
,它只是发送一个空请求)。
经过一番尝试后,我设法让您的示例使用表单数据中的嵌套属性:
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
如果您需要发送带有文件的对象数组,您可以这样做:
parameter name: 'documents', in: :formData, type: :array, required: true
let(:documents) do
[
{
file: file_1,
name: '...'
},
{
file: file_2,
name: '...'
}
]
end