将curl(使用--data-urlencode)转换为ruby

Man*_*mal 3 ruby curl ruby-on-rails

我试图将以下curl命令转换为ruby使用net/http但我还没弄明白如何传递--data-urlencode script@files/jql/events.js命令的一部分.

curl https://mixpanel.com/api/2.0/jql -u <apikey>: --data-urlencode script@files/jql/events.js
Run Code Online (Sandbox Code Playgroud)

使用net/http我有以下...

uri = URI.parse("https://mixpanel.com/api/2.0/jql")
request = Net::HTTP::Get.new(uri)
request.basic_auth("<apikey>", "")

response = Net::HTTP.start(uri.hostname, uri.port, use_ssl: uri.scheme == "https") do |http|
http.request(request)
end
Run Code Online (Sandbox Code Playgroud)

反正有没有这样做?如果不在其中net/http可能使用另一个宝石?

ret*_*oat 5

Mixpanel有它的官方ruby gem 我实际上并没有使用它,但我认为它有所有需要的方法.

但是如果你不喜欢使用它,你可以使用Faraday为Ruby提供一个非常棒的HTTP客户端库.

我用它做了一个简单的例子.请看一看:

class MixpanelClient
  def initialize(url = "https://mixpanel.com/api/2.0/jql", api_key = "ce08d087255d5ceec741819a57174ce5")
    @url = url
    @api_key = api_key
  end

  def query_data
    File.read("#{Rails.root}/lib/qry.js")
  end

  def query_params
    '{"from_date": "2016-01-01", "to_date": "2016-01-07"}'
  end

  def get_events
    resp = Faraday.new(url: @url, ssl: { verify: false }) do |faraday|
      faraday.request  :url_encoded
      faraday.response :logger
      faraday.adapter  Faraday.default_adapter
      faraday.basic_auth(@api_key, "")
    end.get do |req|
      req.params['script'] = query_data
      req.params['params'] = query_params
    end

    raise MixpanelError.new("Mixpanel error") unless resp.status == 200
    JSON.parse(resp.body)
  end
end

class MixpanelError < StandardError; end
Run Code Online (Sandbox Code Playgroud)

结果如下:

[1] pry(main)> m = MixpanelClient.new
=> #<MixpanelClient:0x007fc1442d53b8 @api_key="ce08d087255d5ceec741819a57174ce5", @url="https://mixpanel.com/api/2.0/jql">
[2] pry(main)> m.get_events
I, [2016-06-09T09:05:51.741825 #36920]  INFO -- : get https://mixpanel.com/api/2.0/jql?params=%7B%22from_date%22%3A+%222016-01-01%22%2C+%22to_date%22%3A+%222016-01-07%22%7D&script=function+main%28%29%7B+return+Events%28params%29.groupBy%28%5B%22name%22%5D%2C+mixpanel.reducer.count%28%29%29+%7D
D, [2016-06-09T09:05:51.741912 #36920] DEBUG -- request: Authorization: "Basic Y2UwOGQwODcyNTVkNWNlZWM3NDE4MTlhNTcxNzRjZTU6"
User-Agent: "Faraday v0.9.2"
I, [2016-06-09T09:05:52.773172 #36920]  INFO -- Status: 200
D, [2016-06-09T09:05:52.773245 #36920] DEBUG -- response: server: "nginx/1.9.12"
date: "Thu, 09 Jun 2016 03:05:52 GMT"
content-type: "application/json"
transfer-encoding: "chunked"
connection: "close"
vary: "Accept-Encoding"
cache-control: "no-cache, no-store"
access-control-allow-methods: "GET, POST, OPTIONS"
access-control-allow-headers: "X-PINGOTHER,Content-Type,MaxDataServiceVersion,DataServiceVersion,Authorization,X-Requested-With,If-Modified-Since"
=> [{"key"=>["Change Plan"], "value"=>186}, {"key"=>["View Blog"], "value"=>278}, {"key"=>["View Landing Page"], "value"=>1088}, {"key"=>["login"], "value"=>1241}, {"key"=>["purchase"], "value"=>359}, {"key"=>["signup"], "value"=>116}]
Run Code Online (Sandbox Code Playgroud)

一组ssl: {verufy: false}因为法拉第需要addtitional解决方法与SSL证书的工作:https://github.com/lostisland/faraday/wiki/Setting-up-SSL-certificates