用于从API获取数据的CURL / Ruby替代Python

时间:2011-02-16 11:17:58

标签: python ruby api curl urllib2

我想使用Python从API获取数据。 API文档提供了CURL和Ruby中的示例。如果您可以发布有关如何使用Python执行以下操作的代码片段,我将非常高兴。

获取身份验证令牌:

卷曲示例:

curl -X POST -d "{\"username\" : \"user@sample.com\", \"password\":\"sample\"}" http://api.sample.com/authenticate

Ruby示例:

require 'rubygems'
require 'rest_client'
require 'json'

class AuthorizationClient
  attr_accessor :base_url

  def initialize(base_url)
    @base_url = base_url
  end

  def authenticate(username,password)
    login_data = { 'username' => username, 'password' => password}.to_json
    begin
      JSON.parse(RestClient.post "#{@base_url}/authenticate", login_data, :content_type => :json, :accept => :json)['output']
    rescue Exception => e
      JSON.pretty_generate JSON.parse e.http_body
    end
  end
end

client = AuthorizationClient.new('http://api.sample.com/authenticate')
puts client.authenticate('user@sample.com','sample')

验证后,获取数据:

CURL示例:

curl http://api.sample.com/data/day/2011-02-10/authToken/80afa08-1254-46ee-9545-afasfa4565

Ruby代码:

require 'rubygems'
require 'rest_client'
require 'json'

class ReportingClient
  attr_accessor :auth_token, :base_url

  def initialize(base_url)
    @base_url = base_url
  end

  def authenticate(username,password)
    login_data = { 'username' => username, 'password' => password}.to_json

    response = RestClient.post "#{@base_url}/authenticate", login_data, :content_type => :json, :accept => :json
    @auth_token = JSON.parse(response)['output']
  end

  def get_report(start_date, end_date)
    response = RestClient.get "#{@base_url}/data/day/#{day}/authToken/#{auth_token}"
    JSON.parse(response)
  end

end

client = ReportingClient.new('http://api.sample.com:20960')
client.authenticate('user@sample.com','sample')

results = client.get_report('2011-02-10')

puts JSON.pretty_generate(results)

谢谢..

PS:我知道pycurl。但我不确定我是否真的需要它。我很高兴使用Python本机库。 Pycurl可能因我的需要而过度杀人。

我是Python新手,在阅读'urllib2'文档并尝试示例后,我找不到合适的解决方案。

2 个答案:

答案 0 :(得分:2)

阅读urllib2文档后,您完全不理解哪个部分? 我不知道我的Ruby,但从它的外观来看,它只涉及以json格式发送GET请求和POST请求并解析响应。这对于s​​implejson和urllib2来说非常简单。

答案 1 :(得分:2)

这不是端口,但看起来您正在发送POST然后获取授权令牌,然后使用此发送GET请求。 这是基于我的理解。

import urllib
import urllib2
import simplejson
import datetime

authURL = "http://api.sample.com/authenticate"
values = {"username" : "user@sample.com",
          "password" : "sample"}

data = urllib.urlencode(values)

req = urllib2.Request(authURL, data)
response = urllib2.urlopen(req)

authToken = simplejson.load(response)["output"]

day = str(datetime.date.today())
dataURL = "http://api.sample.com/data/day/" + day + "/authToken/" + authToken

print simplejson.load(urllib2.urlopen(dataURL))