繁体   English   中英

API请求限制的解决方法

[英]Workaround for API Request Limit

我在开发Wordpress插件时遇到了问题。 基本上API我正在构建插件,以限制我需要每分钟6次的请求,但是当插件激活时,我需要发出超过6个请求来下载插件所需的API数据 - 在。

API是LimelightCRM API( http://help.limelightcrm.com/entries/317874-Membership-API-Documentation )。 我正在使用API​​的campaign_view方法,而我正在寻找的可能是批量生成请求,但我不太确定如何解决问题。

想法1:在我的脑海中,我想我需要通过使用campaign_find_active计算我需要在插件激活时使用PHP进行的请求数量,然后将该计数除以请求限制(6),每分钟发出6次campaign_view请求,直到我拥有所需的所有数据并将其存储在Wordpress瞬态中。 但是,假设我需要发出30个请求,用户不能只是等待5分钟来下载数据。 即使我设法为此提出解决方案,也可能需要我设置Wordpress瞬态的时间限制,使插件永远不需要发出超过6个请求。 所以我的下一个想法是,我可以使用Wordpress钩子来检查请求,同时检查最后一批请求的发生时间吗? 所以它已经变得非常棘手了。 我想知道你们是否能指出我正确的方向。 您对我如何能够超过此速率限制有任何想法吗?

想法2:将值存储在数据库中的Cron作业?

//Fetch Campaign ID's
$t_campaign_find_active = get_transient('campaign_find_active');
if(!$t_campaign_find_active){
    limelight_cart_campaign_find_active();
    $t_campaign_find_active = get_transient('campaign_find_active');
    return $t_campaign_find_active;
}

//Fetch Campaign Information for each Campaign ID
$llc_cnames = array();
foreach($llc_cids as $count => $id) {
    if(!get_transient('campaign_view_'.$id)) {
        limelight_cart_campaign_view($id);
        $llc_cnames[$id] = get_transient('campaign_view_'.$id);
    }
}

//Merge Campaign ID's and Campaign Info into Key => Value array
$limelight_campaigns = array_combine($llc_cids, $llc_cnames);

注意:不包括函数limelight_cart_campaign_find_active()limelight_cart_campaign_view() ,因为它们只是发出单个API请求,返回响应并将其存储在Wordpress瞬态中。 如果你们需要它我可以包含代码,但是为了这个例子的目的,插件的那部分工作,所以我没有包含它。

我为这些家伙想出了一个解决方案,我之前应该想到它。 所以我得出的结论是,在当前速率限制下,根据激活下载所有API数据是根本不可能的。 大多数可能使用该插件的人会有太多的广告系列来同时下载所有数据,如果我按照原样保留代码,大多数情况下不可避免地会使用速率限制。 因此,我不是在激活后立即为插件准备好API数据,而是让用户能够根据需要使用AJAX按需进行API调用。 那么让我解释一下它是如何工作的。

首先,在插件激活时,最初不会下载任何数据,并且用户需要输入他们的API凭据,如果凭据有效且API登录,插件将验证它们并给它们一个复选标记那是成功的。 哪个使用一个API请求。

现在,用户只需单击“添加产品”管理页面上的预先填充的广告系列列表,然后点击“添加产品”页面上的按钮即可生成AJAX campaign_find_active请求,该请求将获取广告系列ID并返回一个广告 - 广告系列ID和名称的下拉菜单。 其中只使用一个请求。

获取该下拉数据后,他们需要选择他们想要使用的广告系列,并在选择广告系列ID后,插件会显示另一个按钮,以生成campaign_view请求以获取与该ID相关联的广告系列数据。 这将返回另一个下拉菜单,允许他们选择产品。 这还需要一些CSS和jQuery来显示/隐藏AJAX按钮,具体取决于下拉值。 这只会使用一个API请求,并且由于请求不是自动生成的,并且需要单击按钮,因此在第一个下拉菜单中选择广告系列ID时,用户不会发出多个API请求。

然后,用户将单击发布,并具有附加和缓存所有必要的关注数据的wordpress索引产品。 所有API请求都将以1小时的时间限制存储在瞬态中,并且小时的原因是他们不必等待24小时以防他们进行更新。 我还将在设置页面上包含一个按钮以清除瞬态,以便他们可以根据需要重新下载。 这也可能有点棘手,但就这个问题而言,这不是问题。

总的来说,我只使用3-4个API请求。 我也可以在其中构建一个计数器,这样如果用户一次使用太多请求,我就会向用户显示错误消息。 根据“API已达到每分钟10个请求的限制,请等待60秒再试一次”。

我欢迎任何评论,建议或批评。 希望这可以帮助那些在API请求限制下苦苦挣扎的人,如果您不介意给予用户更多的控制权,那么AJAX是一种很好的解决方法。

我刚刚制作了40个API帐户,并为每个请求随机选择一个..效果很好

 $api_acounts = array( "account1" => "asdfasdfdsaf", "account2" => "asaasdfasdf", "account3" => "asdfasdf", ); $rand = rand(1,count($api_acounts)); $username = "account".$rand; $password = $api_acounts['account'.$rand]; 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM