2016-06-08 136 views
3

我想将下面的curl命令转换为使用net/http的ruby,但我还没有想出如何传递--data-urlencode [email protected]/jql/events.js命令的一部分。将curl转换为ruby

curl https://mixpanel.com/api/2.0/jql -u <apikey>: --data-urlencode [email protected]/jql/events.js 

使用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 

反正有做到这一点?如果不在net/http之内,那么也许使用另一个宝石?

+1

还没有尝试过,但HTTPS ://github.com/taf2/curb听起来像它可以为你工作 – Andbdrew

回答

4

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

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

我做了一个简单的例子。请看看:

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 

下面是结果:

[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}] 

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

+0

这太棒了!它完美的作品。感谢您的帮助!显然,我没有足够的声望来投票回应你的回应。 –

+0

@Manpreet Komal,很高兴能够帮助:)你可以标记我的答案是正确的。这就够了。 – retgoat

+0

@Manpreet Komal,谢谢! – retgoat