20

お互いに話をしようとしているRESTfulRailsアプリが2つあります。どちらもRails3(現時点ではbeta3)で書かれています。サービスへのリクエストでは、すべてのリクエストに必要な単なるパラメータであるAPIキーを使用する必要があります。これを行う方法についての情報が見つからないようです。

リソースが接続するURLは、site=メソッドを介して定義します。同等のquery_params=メソッドなどが必要です。

これに関連して私が見つけた良いブログ投稿が1つあり、それは2008年10月のものであるため、Rails3には必ずしも役立ちません。

更新:私は考えました。小さなラックミドルウェアまたはメタルがこれに対する答えになるでしょうか?リクエストをパススルーして、api_keyを追加することができます。

4

7 に答える 7

22

クエリ文字列にパラメータを渡すためのハッシュであるmodel#prefix_optionsを使用します(または、Model.prefixの一部の置換としても、たとえば「/ myresource /:param/」はprefix_options[:param]の値に置き換えられます。プレフィックスに見つからないハッシュキーがクエリ文字列に追加されます。これは、あなたの場合に必要なものです)。

class Model < ActiveResource::Base
  class << self
    attr_accessor :api_key
  end

  def save
    prefix_options[:api_key] = self.class.api_key
    super
  end
end

Model.site = 'http://yoursite/'
Model.api_key = 'xyz123'
m = Model.new(:field_1 => 'value 1')
# hits http://yoursite:80/models.xml?api_key=xyz123
m.save
于 2011-04-14T07:09:33.253 に答える
10

私は最近、同様の問題に直面しました.Rails3を使用している場合、カスタムヘッダーの使用がサポートされているため、これらの状況がはるかに簡単になります.

リクエストを行っている側で、追加します

headers['app_key'] = 'Your_App_Key'

ActiveResource::Base から継承しているクラスに

あなたがサーバーである場合、認証のために、単にそれを次のように受け取ります

request.headers['HTTP_APP_KEY']

例えば:

class Magic < ActiveResource::Base
    headers['app_key'] = 'Your_App_Key'
end

Magic.get、Magic.find、Magic.post はすべて app_key を送信します。

于 2011-09-29T10:50:35.607 に答える
4

私はもっ​​と良い解決策を持っています!ミドルウェアでラックを試してみましたが、この方法で解決策が見つかりません....

ActiveReouse::Base のメソッドをオーバーライドするためのこのモジュールを提案します

このライブラリを /lib/active_resource/extend/ ディレクトリに追加します config/application.rbの
"config.autoload_paths += %W(#{config.root}/lib)"のコメントを外すことを忘れないでください

module ActiveResource #:nodoc:
  module Extend
    module AuthWithApi
      module ClassMethods
        def element_path_with_auth(*args)
          element_path_without_auth(*args).concat("?auth_token=#{self.api_key}")
        end
        def new_element_path_with_auth(*args)
          new_element_path_without_auth(*args).concat("?auth_token=#{self.api_key}")
        end
        def collection_path_with_auth(*args)
          collection_path_without_auth(*args).concat("?auth_token=#{self.api_key}")
        end
      end

      def self.included(base)
        base.class_eval do
          extend ClassMethods
          class << self
            alias_method_chain :element_path, :auth
            alias_method_chain :new_element_path, :auth
            alias_method_chain :collection_path, :auth
            attr_accessor :api_key
          end
        end
      end  
    end
  end  
end

モデルで

class Post < ActiveResource::Base
  include ActiveResource::Extend::AuthWithApi

  self.site = "http://application.localhost.com:3000/"
  self.format = :json

  self.api_key = 'jCxKPj8wJJdOnQJB8ERy'

  schema do
    string  :title
    string  :content
  end

end
于 2011-05-25T11:58:48.023 に答える
3

Joel Azemarの回答に基づいていますが、いくつかの変更を加える必要がありました..まず、私が使用したアクティブなリソースgem(2.3.8)には、「new_element_path」がないため、明らかに失敗したエイリアシング..次に、更新しましたトークンがクエリに追加される方法は、自分でパラメーターを追加するとすぐに壊れてしまうためです。たとえば、 http://example.com/api/v1/clients.xml ?vat=0123456789?token=xEIx6fBsxy6sKLJMPVM4のリクエスト(?token= io &token= に注意)

これが私の更新されたスニペット auth_with_api.rb です。

module ActiveResource #:nodoc:
  module Extend
    module AuthWithApi
      module ClassMethods
        def element_path_with_auth(id, prefix_options = {}, query_options = nil)
          query_options.merge!({:token => self.api_key})
          element_path_without_auth(id, prefix_options, query_options)
        end
        def collection_path_with_auth(prefix_options = {}, query_options = nil)
          query_options.merge!({:token => self.api_key})
          collection_path_without_auth(prefix_options, query_options)
        end
      end

      def self.included(base)
        base.class_eval do
          extend ClassMethods
          class << self
            alias_method_chain :element_path, :auth
            # alias_method_chain :new_element_path, :auth
            alias_method_chain :collection_path, :auth
            attr_accessor :api_key
          end
        end
      end  
    end
  end
end
于 2012-03-06T11:30:02.867 に答える
2

現在、アクティブなリソースには、API キーをリモート サービスに渡す適切な方法がありません。パラメータとして api_key を渡すと、それがリモート サービスのオブジェクト属性に追加されます。これは、あなたが例外とする動作ではないと思います。それは確かに私が必要とする行動ではありませんでした

于 2011-01-14T09:55:30.120 に答える
1

アクティブ リソース オブジェクトは、(簡略化された) アクティブ レコード オブジェクトのように動作します。新しいパラメーターを通過させたい場合は、それを属性として追加することで AR オブジェクトに設定できます。例えば:

jane = Person.create(:first => 'Jane', :last => 'Doe', :api_key => THE_API_KEY)

api_key をパラメーターとして他のすべてのものと一緒に渡す必要があります。

于 2010-12-10T18:25:47.947 に答える