次のことを行う必要がある API を扱っています (API は変更できません)。
- サービスにログインしてご利用ください(ログイン)
- ログインからのトークン情報といくつかの 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 - しかし、それは私にはさらに醜いようです。