2016-06-08 133 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