У нас возникла проблема с Podio Api или что-то еще, Podio не задокументировал.
Мы делаем запрос к Api, чтобы получить элемент с функцией ->getItemById()
, Этот элемент имеет файловые поля и вложенные файлы. Для редактирования этих файлов на нашем сервере нам нужны rawData этих файлов, поэтому мы вызываем ->getFile()
а также ->getRawData()
,
Все отлично работает. После ~ 15-20 запросов в течение ~ 10 минут (время и количество запросов меняются в каждом тесте) Мы получаем ошибки от Podio Server. Мы получаем ошибки, даже если мы помещаем короткие задержки между запросами (проверено до 30 секунд), поэтому я думаю, что это не «предел количества запросов на пакетирование». Ошибки с номером 420, который описывается как Ошибка RateLimit. После нескольких минут ожидания ошибка исчезла, и сервер ответил на правильный ответ. Но у нас абсолютно нет никакого плана, когда это произойдет.
Мы сделали функцию, чтобы проверить, не попадаем ли мы в RateLimit, но все еще есть, как для обычного запроса, так и для запроса с ограниченной скоростью. Как вы можете видеть на скриншотах выше.
Пожалуйста, не отвечайте со ссылкой на документацию по предельной скорости Podio. Я прочитал этот раздел несколько раз, и я знаю, как эти ограничения установлены. Наша проблема возникает только тогда, когда мы вызываем файловый сервер (files.podio.com), а не когда мы делаем другие запросы API.
У кого-нибудь был подобный опыт с нашим делом?
Функции для вызова из PHP Api:
/**
* get Item by Public ID (in url, starts with 1)
*/
public function getItemById($item_id) {
try {
return \PodioItem::get_by_app_item_id($this->app_id, $item_id );
} catch (Exception $e) {
throw new Exception($e->body['error_description']);
}
}
public function getFile($file_id) {
try {
return \PodioFile::get( $file_id );
} catch (Exception $e) {
throw new Exception($e->body['error_description']);
}
}
public function getRawData($file) {
try {
return $file->get_raw();
} catch (Exception $e) {
throw new Exception("Status: " . $e->status . " Message: " . (empty($e->body['error_description']) ? '-' : $e->body['error_description']));
}
}
Звоните на сервер Podio с помощью звонка RateLimit:
$podio = new \Podio\Api\Api('APP_ID', 'APP_TOKEN');
for($i = 0; $i < 10; $i++) {
echo "Rate Limit: " . $podio->getRateLimitRemaining() . '<br>';
$item = $podio->getItemById(500);
echo "Rate Limit: " . $podio->getRateLimitRemaining() . '<br>';
$file = $podio->getFile(668548372);
$raw_file = $podio->getRawData($file);
}
Вывод браузера. Как вы можете видеть, RateLimit не работает, но мы получаем 420 сразу после вызова getRawData ()
Служба поддержки Podio сказала мне, что они не оказывают поддержку частным лицам, несмотря на то, что мы являемся компанией, которая ежедневно использует podio, и это, на мой взгляд, ошибка на их сервере (или это нигде не задокументировано).
Обновить:
Я сделал вторую функцию, чтобы вызвать это:
// This function is used to test Podio Fileserver for Rate Limits
public function podioAction() {
$podio = new \Podio\Api\Api('APP_ID', 'APP_TOKEN');
for($i = 0; $i < 100; $i++) {
try {
$item = $podio->getItemById(500);
echo date("H:i:s") . " Rate Limit Remaining: " . $podio->getRateLimitRemaining() . ', EndPoint URL: /app/{$app_id}/item/{$app_item_id} <br>';
$podio->updateItem($item->item_id, array('titel-intern' => 'API Test'), array(), array('silent' => true));
echo date("H:i:s") . " Rate Limit Remaining: " . $podio->getRateLimitRemaining() . ', EndPoint URL: /item/{$item_id} <br>';
$file = $podio->getFile(668548372);
echo date("H:i:s") . " Rate Limit Remaining: " . $podio->getRateLimitRemaining() . ', EndPoint URL: /file/{$file_id} <br>';
$raw_file = $podio->getRawData($file);
echo date("H:i:s") . " File received, EndPoint URL: https://files.podio.com/668548372 " . '<br>';
} catch(Exception $e) {
echo date("H:i:s") . " Error: " . $e->getMessage() . " <br>";
exit;
}
}
exit;
}
Это дает мне следующий Browseroutput (первые несколько строк не включены):
15:46:38 Rate Limit Remaining: 4753, EndPoint URL: /app/{$app_id}/item/{$app_item_id}
15:46:38 Rate Limit Remaining: 8, EndPoint URL: /item/{$item_id}
15:46:38 Rate Limit Remaining: 4752, EndPoint URL: /file/{$file_id}
15:46:38 File received, EndPoint URL: https://files.podio.com/668548372
15:46:39 Rate Limit Remaining: 4751, EndPoint URL: /app/{$app_id}/item/{$app_item_id}
15:46:39 Rate Limit Remaining: 6, EndPoint URL: /item/{$item_id}
15:46:39 Rate Limit Remaining: 4750, EndPoint URL: /file/{$file_id}
15:46:39 File received, EndPoint URL: https://files.podio.com/668548372
15:46:39 Rate Limit Remaining: 4749, EndPoint URL: /app/{$app_id}/item/{$app_item_id}
15:46:40 Rate Limit Remaining: 4, EndPoint URL: /item/{$item_id}
15:46:40 Rate Limit Remaining: 4748, EndPoint URL: /file/{$file_id}
15:46:40 File received, EndPoint URL: https://files.podio.com/668548372
15:46:40 Rate Limit Remaining: 4747, EndPoint URL: /app/{$app_id}/item/{$app_item_id}
15:46:40 Rate Limit Remaining: 2, EndPoint URL: /item/{$item_id}
15:46:40 Rate Limit Remaining: 4746, EndPoint URL: /file/{$file_id}
15:46:41 File received, EndPoint URL: https://files.podio.com/668548372
15:46:41 Rate Limit Remaining: 4745, EndPoint URL: /app/{$app_id}/item/{$app_item_id}
15:46:41 Rate Limit Remaining: 0, EndPoint URL: /item/{$item_id}
15:46:41 Rate Limit Remaining: 4744, EndPoint URL: /file/{$file_id}
15:46:41 Error: Status: 420 Message: -
Сегодня в этом тесте все кажется нормальным. Кажется, что файлы также являются запросами RateLimited и выдают ошибки, когда эти ограничения отключены. Но на скриншоте выше у меня был другой результат. Если это всегда так, как сегодня, проблем нет, и я могу это отследить. Но это было не так в последние несколько дней.
Я пишу снова, если это произойдет, как это было в то время, задавая этот вопрос, но сейчас все, кажется, работает нормально.
->getRawData()
метод помечен как внутренний и не указан в https://developers.podio.com/doc/files как доступный метод. Вы не должны использовать это 🙂
Пожалуйста, используйте link
атрибут file
объект из ->getFile()
метод. И отправьте обычный заголовок авторизации на эту конечную точку для аутентификации для загрузки. Загрузка также подлежит снижению лимита ->getRawData()
метод)
Других решений пока нет …