0

次のことを行う必要がある API を扱っています (API は変更できません)。

  1. サービスにログインしてご利用ください(ログイン)
  2. ログインからのトークン情報といくつかの api メソッド固有のパラメーターを渡す api メソッドを使用します (このような各メソッド呼び出しは、独自の「api_user」メソッドにラップされます。以下を参照してください)。

ただし、ステップ 2 では、API によって特定の例外が発生する可能性があります。その場合、ログイン メソッドを再試行し、新しいトークンで同じ API を再度呼び出す必要があります。各 API メソッドには、追加のパラメーター (token パラメーターとは別に) がある場合があります。概念的には、すでにログインしている場合は、しばらく使用できるトークンを取得できます。

def api_user
  begin
    api_method1 token, x,y,z
  RetryException => e
    new_token = login
    api_method1 token, x,y,z
  end
end

これをエレガントに行うにはどうすればよいですか?オプション1:

各 api_user メソッドについて - 上記を個別に実行します

オプション 2: Ruby のメタプログラミングを使用します。これを以下に示してみました。

class Y
  def self.api_invoker(token,y,z)
    if token == 'old'
      raise "Old token - renew it"
    end 
    puts "Token = #{token}"
  end 

  def self.call_method(m, *params)
    method = Y.method(m)
    begin
      method.call(*params)
    rescue Exception => e
      if e.message.include? "Old token"
        puts "params before = #{params}"
        params[0] = "new"
        puts "params after = #{params}"
        method.call(*params)
      end 
    end 
  end 

end

上記のメソッドを次のように呼び出すと、再試行がトリガーされ、「新しい」トークンがメソッドの 2 回目の呼び出しに渡されます。

Y.call_method("api_invoker", "old",2,3)

1 からデザインが好きではありません。少し複雑に思えますが、すべての API インボーカー メソッドから重複した再試行ロジックが削除されるため、オプション 1 よりも好きです。2. ruby​​ は名前を使用してパラメーターにアクセスできないため、すべての「api インボーカー」メソッドでトークン パラメーターを最初のパラメーターにするという規則を強制する必要があります。これは、再試行時にそのパラメーターを新しいトークンに置き換えることができるようにするためです。

名前を使用してパラメーターにアクセスする方法が ruby​​ にある場合、上記の設計は受け入れられるものでした。

より良い方法を提案できますか?

ありがとう!PS: 各 api_invoker の「ハッシュ」ですべてのパラメーターを渡し、トークン パラメーター名を使用して、配置場所に関係なくアクセスできます (リンクhttp://deepfall.blogspot.com/2008に記載されているものと同様)。/08/named-parameters-in-ruby.html - しかし、それは私にはさらに醜いようです。

4

1 に答える 1

0

オプション 2 を使用して、try catch ブロックの繰り返しを回避しました。

于 2012-09-08T02:07:32.080 に答える