如何发布文件并使用HTTParty返回状态

时间:2016-11-11 18:02:15

标签: ruby httparty

这适用于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

2 个答案:

答案 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 => "*/*"
      }

  )

enter image description here

答案 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

参考: