请接受我的道歉,如果这是非常明显的,我只是遗漏了。我有一个perl脚本,以每分钟超过100个调用的突发速率击中Asana restful API。当我对它进行压力测试时,我偶尔会达到他们的速率限制并看到错误429.我从阅读Asana的documentation知道它会返回一个“retry-after”响应标题,但我无法理解生命我如何检索/打开/读取此标题。您可以提供任何建议。
编辑: 我的代码附在下面。当然,我已经删除了敏感信息,例如我的API密钥和项目编号,但核心代码就在这里。如果我只运行一次,它不会产生足够的每分钟调用来触发错误。我必须同时运行它约3-4次才能产生错误。有人可能会说“好吧不要这样做”。虽然正确,但这个练习的目的是产生错误,所以同时运行它是好的。
当您使用有效的API密钥和项目编号时,有时会出现此错误:
{"errors":[{"message":"You have made too many requests recently. Please, be chill."}]}
我的问题是如何检索显然包含retry-after字段的标题以及几秒钟。每次返回错误时,我可能只会延迟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";
答案 0 :(得分: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这样的东西。 http://search.cpan.org/dist/WWW-Asana/
答案 1 :(得分:0)
我们遇到了我们的Asana Connector for Klok的问题。我们联系了Asana的人们,他们愿意将“重试后”数量添加到响应主体中。所以,你现在可以从“retry_after”属性中获取它:
{
"errors":[{"message":"You have made too many requests recently. Please, be chill."}],
"retry_after":30
}
这对我们来说是一个很大的帮助,因为我们使用的是Adobe AIR 2.x,它不允许我们访问错误响应的响应头。
答案 2 :(得分:0)
有一个CPAN模块,WWW::Asana,它可以正确处理速率限制响应。