1

これが私が単に欠けているという非常に明白なものである場合は、私の謝罪を受け入れてください. Asana restful API を 1 分間に 100 回を少し超えるバースト レートでヒットする perl スクリプトがあります。ストレス テストを行うと、レート制限に達してエラー 429 が表示されることがあります。このヘッダーを取得/オープン/読み取ります。アドバイスをいただければ幸いです。

編集:私のコードは以下に添付されています。もちろん、API キーやプロジェクト番号などの機密情報は消去しましたが、コア コードはここにあります。これを 1 回だけ実行すると、エラーをトリガーするのに十分な 1 分あたりの呼び出しが生成されません。エラーを生成するには、同時に約3〜4回実行する必要があります。「そんなことしないで」と言う人もいるかもしれません。正しいですが、この演習のポイントはエラーを生成することなので、同時に 4 回実行することをお勧めします。

有効な API キーとプロジェクト番号を使用してこれを行うと、次のエラーが発生することがあります。

{"errors":[{"message":"You have made too many requests recently. Please, be chill."}]}

私の質問は、明らかに再試行フィールドと秒数を含むヘッダーを取得する方法です。エラーが返されるたびに 20 秒の遅延を構築することに頼るかもしれませんが、エラーをよりエレガントに処理したいと考えています。

#!/usr/local/bin/perl
my $counter = 0;
my $AsanaAPIcode = "...";
my $AsanaProjectID = "...";
my $AsanaFullString = 'curl -u ' . $AsanaAPIcode . ': https://app.asana.com/api/1.0/projects/' . $AsanaProjectID . '?opt_fields=archived';
my $APIoutput = `$AsanaFullString`;
print $APIoutput;
my $startTime = time;
my $totalCount = 200;
while ($counter<=$totalCount) {
  print $counter . "\n";
  $APIoutput = `$AsanaFullString`;
  print $APIoutput . "\n";
  $counter++;
}
my $endTime = time;
my $totalTime = $endTime - $startTime;
print "Total time = " . $totalTime . " seconds.\n";
print $totalCount / ($totalTime / 60) . " API calls per minute.\n";
print "end";
4

3 に答える 3

1

「Retry-After」は HTTP 応答にあり、curl へのバックティック呼び出しによって失われます。

不格好な解決策は、'curl -D' (--dump-headers) を使用することです。これは、すべての HTTP ヘッダーを応答にドロップするため、解析して削除する必要があります。

より良い解決策は、LWP ライブラリ (perldoc LWP::UserAgent) を使用することです。明らかに、API キーなしでこのコードをテストすることはできません...これらを URL に挿入できると思います (https://name:password@app.asana.com/api...)

use LWP::UserAgent;
use LWP::Protocol::https;
my $agent = LWP::UserAgent->new(); # check LWP docs for extra params
my $request = LWP::Request->new( 'https://app.asana.com/api/1.0/projects/' . $AsanaProjectID . '?opt_fields=archived' )
my $response = $ua->request($request);
if ($response->code == 429) {
  my $retry = $response->header('Retry-After');
  ...
}

または... WWW::Asana などの CPAN を試すこともできます。 http://search.cpan.org/dist/WWW-Asana/

于 2012-11-29T09:44:09.993 に答える
0

そのための CPAN モジュールWWW::Asanaがあり、レート制限応答を適切に処理します。

于 2013-01-17T02:10:27.650 に答える
0

Klok 用の Asana コネクタで問題が発生しました。Asana の担当者に連絡したところ、応答の本文に「再試行後」の金額を追加してくれました。したがって、「retry_after」プロパティから取得できます。

{
 "errors":[{"message":"You have made too many requests recently. Please, be chill."}],
 "retry_after":30
 }

エラー応答の応答ヘッダーにアクセスできない Adob​​e AIR 2.x を使用しているため、これは大きな助けになりました。

于 2013-01-17T01:40:28.813 に答える