SimpleDB для ActiveResource. Рельсы - PullRequest
6 голосов
/ 01 марта 2010

Я ищу способ сопоставить ActiveResource с SimpleDB

Я хочу избегать плагинов / гемов, так как все, что я использовал, устарело / содержит ошибки / не поддерживается

Это не кажется сложным, интересно, кто-нибудь из вас успешно реализовал приложение rails с simpleDB в качестве активного ресурса. Как ты сделал это? Спасибо.

Ответы [ 2 ]

2 голосов
/ 17 апреля 2010

Я не работал с SimpleDB, но я сопоставил ActiveResource с API-интерфейсом REST гибкой системы платежей Amazon и просто просматривая документы, которые кажутся похожими, поэтому в основном то, что я сделал, может быть, вы можете использовать это в качестве отправной точки. *

require 'base64'
require 'openssl'

class AmazonFlexiblePaymentResource < ActiveResource::Base
  self.site = AMZ_CONFIG['flexible_api_url']

  def self.rest_api(options = {})
    params = common_request_params.update(options)

    sig = compute_signature(AMZ_CONFIG['secret_access_key'], 'get', site, params)

    rest_req = {'Signature' => sig}.update(params)

    # make the http get call
    connection.get("/#{query_string(rest_req)}", headers)
  end

  protected

  # these are the params are common to all rest api calls
  def self.common_request_params
    { 'AWSAccessKeyId' => AMZ_CONFIG['access_key_id'],
      'SignatureVersion' => 2,
      'SignatureMethod' => 'HmacSHA256',
      'Timestamp' => Time.now.utc.iso8601,
      'Version' => '2008-09-17'}
  end

  def self.compute_signature(key, method, end_point_url, params)
    query_str = parameters.sort.collect {|k, v| v.to_query(k)}.join '&'

    # cannot use plus for space, and tilde needs to be reversed
    query_str.gsub!('+', '%20')
    query_str.gsub!('%7E', '~')

    to_sign = [method.upcase, end_point_uri.host.downcase,
        end_point_uri.request_uri, query_str].join "\n"

    digest = OpenSSL::Digest::Digest.new('sha256')
    hmac = OpenSSL::HMAC.digest(digest, key, to_sign)
    Base64.encode64(hmac).chomp
  end
end

Тогда я просто звоню вот так

res = AmazonFlexiblePaymentResource.rest_api({ 'Action' => 'GetTransactionStatus', 'TransactionId' => '1234567890ABCDEFGHIJ' })

И ответом является хэш проанализированного xml. Опять же, это работает для Amazon Flexible Payments Service, поэтому вам может потребоваться внести изменения, соответствующие API REST SimpleDB.

1 голос
/ 18 августа 2010

Это должен быть ActiveResource?Если вы хотите его как ActiveRecord, посмотрите SimpleRecord.

http://github.com/appoxy/simple_record

Это очень активно поддерживается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...