这是使用Net::HTTP::Post
request = Net::HTTP::Post.new(url)
...
form_data = [
['attachments[]', File.open('file1.txt')],
['attachments[]', File.open('file2.txt')]
]
request.set_form form_data, 'multipart/form-data'
http.request(request)
现在,我尝试使用以下httparty
,但它不起作用。
body = { attachments: [ File.open('file1.txt'), File.open('file2.txt') ] }
HTTParty.post(url, body: body)
我从Web服务呼叫中获得的响应如下:
#<HTTParty::Response:0x557d7b549f90 parsed_response={"error"=>true, "error_code"=>"invalid_attachment", "error_message"=>"Attachmen
t(s) not found or invalid."}, @response=#<Net::HTTPBadRequest 400 Bad Request readbody=true>, @headers={"server"=>["nginx"], "date"=>[
"Mon, 20 May 2019 07:41:50 GMT"], "content-type"=>["application/json"], "content-length"=>["102"], "connection"=>["close"], "vary"=>["
Authorization"], "set-cookie"=>["c18664e1c22ce71c0c91742fbeaaa863=uv425hihrbdatsql1udrlbs9as; path=/"], "expires"=>["Thu, 19 Nov 1981
08:52:00 GMT", "-1"], "cache-control"=>["no-store, no-cache, must-revalidate", "private, must-revalidate"], "pragma"=>["no-cache", "no
-cache"], "x-ratelimit-limit"=>["60"], "x-ratelimit-remaining"=>["59"], "strict-transport-security"=>["max-age=63072000; includeSubdom
ains;"]}>
看起来它无法读取文件的内容。HTTParty
是否支持此?还是我需要使用其他一些宝石?
这样的事情应该有效,我只是测试了它,对我毫无问题。
HTTParty.post(url,
body: { attachments: [
File.read('foo.txt'),
File.read('bar.txt')] })
使用httparty,您可以以相同的方式将io/files传递为参数(如果参数中有一个文件,则自动设置为true(。
,但请记住,上传后应关闭文件,否则您可能会在GC收集它们之前用完文件:
files = ['file1.txt', 'file2.txt'].map{|fname| File.open(fname) }
begin
HTTParty.post(url, body: { attachments: files })
ensure
files.each(&:close)
end
如果NET/HTTP变体确实可以对您有用(并且实际上与您的代码相同(。
要查看的另一件事是文件类型检测 - 因为文件上传由文件名,内容类型和数据本身组成。错误400带有" Invalid_attachment"的错误,您会发现,更可能与服务器端上的内容类型或其他验证有关(因此,请确保您正在使用相同的文件进行测试,并且除了HTTP LIB外,其他任何更改都没有其他更改(,也请检查HTTPARTY成为最近版本
我编写了一个测试程序,该程序使用Net::HTTP
和HTTParty
发送相同的多部分请求。然后它比较并打印请求字符串,以便我们可以比较它们。这两个请求之间唯一的实质性区别是HTTPARTY试图猜测并设置Content-Type
标头(例如,用于名为 file1.txt 的文件的text/plain
(,而NET :: HTTP始终使用application/octet-stream
。
httparty肯定会读取文件并在请求中发送它们。因此,我建议您调查服务器是否由于Content-Type
返回错误(也许不支持您的特定请求中的内容类型(。
供您参考,这是测试程序和特定结果。