multipart POST 使用 Airborne,失败 "Missing start boundary"

multipart POST with Airborne, failing with "Missing start boundary"

已经使用 rest-client 一段时间了,但对 Airborne 还是个新手。我遇到的问题是我似乎无法使用 Airborne 获得 multi-part post 文件上传。我以一个糟糕的请求结束 'Missing start boundary' 我的机载 POST 看起来像这样:

  before :all do
    fyle = File.new("e:/some-file.jpg", 'rb')
    body = {:profile => "KonflictME", :file => fyle, :multipart => true}
    post "/uploads", body, { :content_type => 'multipart/form-data' }
  end

我使用 rest-client 的工作示例如下所示:

fyle = File.new("e:/some-file.jpg, 'rb')
resp = RestClient.post base_path_api << "uploads",
  {:profile => "KonflictME", :file => fyle, :multipart => true},
  {:authorization => "myTokenString}

两者之间没有太大区别,应该不会,因为 rest-client 是在机载引擎盖下使用的。 对于 Airborne,base_url 和 headers 在配置中设置 (spec_helper.rb)

还有其他人尝试过 multi-part post 空降兵吗?上传只是我测试套件的一小部分,我有一个 non-Airborne 解决方案(直接使用 rest-client 进行这些测试),但希望让团队的其他成员保持简单。

airborne framework是基于restclient的,在源码中有一行lib/airborne/rest_client_requester.rb:

request_body = request_body.to_json if options[:body].is_a?(Hash)

这意味着您定义的每个实体都将被传输到json,并作为以下行的参数:

RestClient.send(method, get_url(url), request_body, headers)

但是在restclient中,无论是post一个json还是上传一个文件,都不需要考虑body的样式。如果要上传文件可以将上面的代码改成:

request_body = request_body.to_json if options[:body].is_a?(Hash) && options[:body].to_json["file"].nil?

检查您定义的正文是否包含文件。我在最近的项目中进行了此更改。

希望对您有所帮助。

您可以使用 RestClient(airborne 的依赖项)使这变得相当容易。用散列写出你的参数:

params = {
              other_param: 'Some param',
              file: File.new(Rails.root.join('spec', 'fixtures', 'sample.csv'), 'r')
          }
      }

multipart = RestClient::Payload::Multipart.new(params)
post endpoint, params: multipart.read, headers: multipart.headers