CURL / Ruby Альтернатива в Python для извлечения данных из API - PullRequest
0 голосов
/ 16 февраля 2011

Я хочу получать данные из API, используя Python.В документации по API приведены примеры на CURL и Ruby.Я был бы очень рад, если бы вы могли опубликовать фрагменты кода о том, как сделать следующие вещи с Python.

Чтобы получить токен аутентификации:

Пример Curl:

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 ]

2 голосов
/ 16 февраля 2011

Это не порт, но похоже, что вы отправляете 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))
2 голосов
/ 16 февраля 2011

Какую именно часть вы не поняли после прочтения документации по urllib2? Я не знаю свой Ruby, но, судя по всему, он просто включает в себя отправку запросов GET и POST в формате json и анализ ответов. Это довольно тривиально для simplejson и urllib2.

...