这适用于shell:
require 'httparty'
require 'json'
require 'pp'
token = "6Ijg3ZDMzODUxLTdlMmMtN"
url = "https://apis.xxxxxxxx.com/v2-beta/media"
options = {
:headers => {"Authorization" => " Bearer #{token}", "Content-Type" => "multipart/form-data" , "Accept" => "application/json"},
:body => {"media" => '@recording.mp3'}
}
puts "***** #{options} ******\n"
j = HTTParty.post(url, options)
s = JSON.parse(j.body)
pp s
我想用HTTParty做同样的事情,但是,我找不到任何能够说明如何指定这些标题的例子。
这是我所拥有的,但它会引发JSON错误:
(error) .rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/json/common.rb:156:in `parse': 784: unexpected token at 'Failed to create MuleMessage (org.mule.api.lifecycle.CreateException)' (JSON::ParserError)
错误是:
HbaseAdmin
答案 0 :(得分:2)
通过使用RestClient gem,我们可以轻松处理文件上传,但请确保安装rest-client gem。
我还附上了邮递员的示例请求的屏幕截图。
控制器中的代码如下所示,
res = RestClient::Request.execute(
method: :post,
url: "http://www.your_url.com",
payload: params,
headers: {
'Content-Type' => "multipart/form-data",
Authorization: "some_key",
:Accept => "*/*"
}
)
答案 1 :(得分:0)
第一期
如@Jordan Running所述,“ @”语法特定于curl。 HTTParty类似物将传递File对象。这将隐式告诉HTTParty使用multipart/form-data
内容类型。
第二个问题
由于我们在标头中明确要求JSON响应,因此HTTParty隐式尝试将响应解析为JSON(在HTTParty.post()
内部)。但是服务器正在以纯文本形式进行响应,因此在将响应分配给JSON::ParserError
之前,我们得到了j
。
由于服务器不支持我们对JSON的请求,因此建议您通过在请求选项中添加format: :plain
来抑制HTTParty的隐式解析。然后,我们可以自己解析响应并适当地响应JSON::ParserError
。
解决方案
这样的事情应该做你想要的:
url = 'https://apis.xxxxxxxx.com/v2-beta/media'
options = {
headers: {
'Authorization' => " Bearer #{token}",
'Accept' => 'application/json'
},
body: {
media: File.open('recording.mp3')
},
format: :plain
}
j = HTTParty.post(url, options)
s =
begin
JSON.parse(j.body)
rescue JSON::ParserError => e
raise "POST request failed: #{j.body}"
end
pp s
参考: