Я создал приложение, которое использует Bigcommerce PHP SDK для доступа к их API. В разных частях моего приложения я использую методы из SDK для выполнения различных задач. Например, если мне нужно получить продукт из магазина клиента, я напишу в своем скрипте следующее:
Bigcommerce::getProduct(123);
В других случаях мне может понадобиться получить заказ, или горстку или заказы или продукты, или отредактировать продукт. Прочитав документацию по API Bigcommerce, вы узнаете, что они будут оценивать ограничения вызовов, и, если ограничение скорости будет достигнуто, они ответят кодом ошибки, чтобы предупредить вас, что вы должны подождать определенное количество секунд, прежде чем делать следующий вызов API. Вы можете прочитать об этом здесь (https://developer.bigcommerce.com/api/rate-limits/basic).
Одним из способов соблюдения этих ограничений является добавление кода, подобного следующему, после каждого места в моем приложении, которое я называю Bigcommerce API:
$product = Bigcommerce::getProduct(123);
if(!$product){
if(Bigcommerce::getLastError()->code == 429){
sleep(Bigcommerce::connection()->getHeader("X-Retry-After"));
//get the product again
$product = Bigcommerce::getProduct(123);
}
}
Тем не менее, это может быстро стать огромной болью для управления каждый раз, когда я вызываю API. Мой вопрос заключается в том, должен ли я написать свою собственную функцию для обработки вызова API, в которую встроена проверка ограничения скорости. Что-то вроде:
function callBigcommerceApi($method, $args)
{
$response = Bigcommerce::$method($args);
if(!$response){
if(Bigcommerce::getLastError()->code == 429){
sleep(Bigcommerce::connection()->getHeader("X-Retry-After"));
callBigcommerceApi($method, $args);
}
else{
return $response;
}
}
}
Или я должен каким-то образом интегрировать такую функцию в сам SDK, чтобы каждый раз, когда вызывался какой-либо метод из SDK, он подвергался ограничению скорости и знал, как с ним обращаться?
Задача ещё не решена.
Других решений пока нет …