Медленные ответы с использованием Asana API

Информация

Я начал использовать Asana API для создания собственного обзора задач в нашей CMS. Я нашел API на GitHub что мне очень помогает в этом.
Как я уже упоминал в предыдущий вопрос, Я хотел получить все задачи для определенного пользователя. Мне удалось сделать это с помощью кода ниже.

public function user($id)
{
if (isset($_SERVER['HTTP_X_REQUESTED_WITH']) &&
($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest')) {
$this->layout = 'ajax';
}

$asana = new Asana(array(
'apiKey' => 'xxxxxxxxxxxxxxxxxxxx'
));

$results = json_decode($asana->getTasksByFilter(array(
'assignee' => $id,
'workspace' => 'xxxxxxxxxx'
)));

if ($asana->responseCode != '200' || is_null($results)) {
throw new \Exception('Error while trying to connect to Asana, response code: ' . $asana->responseCode, 1);
}

$tasks = array();
foreach ($results->data as $task) {
$result = json_decode($asana->getTaskTags($task->id));
$task->tags = $result->data;
$tasks[] = $task;
}

$user = json_decode($asana->getUserInfo($id));

if ($asana->responseCode != '200' || is_null($user)) {
throw new \Exception('Error while trying to connect to Asana, response code: ' . $asana->responseCode, 1);
}

$this->render("tasks", array(
'tasks' => $tasks,
'title' => 'Tasks for '.$user->data->name
));
}

Эта проблема

Выше работает нормально, за исключением одного. Это медленнее, чем загрузка машины с Windows Vista (очень медленно :)). Если я включу теги, это может занять до 60 секунд, прежде чем я получу все результаты. Если я не включу теги, это займет около 5 секунд, что все еще слишком долго. Теперь я надеюсь, что я не первый, кто использовал API Asana, и что некоторые из вас могли сталкиваться с той же проблемой в прошлом.

1

Решение

Сам API мог бы определенно быть быстрее, и у нас есть некоторые долгосрочные планы относительно того, как улучшить отзывчивость, но в ближайшей и среднесрочной перспективе API, вероятно, останется такой же базовой скоростью.

Хитрость в том, чтобы не тратить много времени на доступ к API, как правило, состоит в том, чтобы уменьшить количество запросов, которые вы делаете, и запрашивать только те данные, которые вам нужны. Иногда клиенты API не облегчают эту задачу, и я не знаком с клиентом PHP конкретно, но я могу привести пример того, как это будет работать в целом только с простыми HTTP-запросами.

Итак, сейчас вы делаете следующее в псевдокоде:

GET /tasks?assignee=...&workspace=...
foreach task
GET /task/.../tags
GET /users/...

Так что, если у пользователя есть 20 задач (а у реальных пользователей обычно есть много более 20 заданий — если вы заботитесь только о незавершенных задачах, выполненных за последнюю, скажем, неделю, вы можете использовать ?completed_since=<DATE_ONE_WEEK_AGO>), вы сделали 22 запроса. И потому что это синхронно, вы ждете несколько секунд для каждого из этих запросов, прежде чем начать следующий.

К счастью, в API есть параметр с именем ?opt_fields что позволяет вам указать точный данные вам нужны. Например: предположим, что для задачи обучения все, что вам действительно нужно, это знать идентификатор задачи, имя задачи, теги, которые у нее есть, и их имена. Вы можете запросить:

GET /tasks?assignee=...&workspace=...&opt_fields=name,tags.name

(Каждый включенный ресурс всегда приносит свои id поле)

Это позволит вам получить в одном HTTP-запросе все данные, которые вам нужны. (Ну, поиск пользователя по-прежнему отдельный, но по крайней мере это всего лишь 1 дополнительный запрос вместо N). Для получения дополнительной информации о opt_fields, ознакомьтесь с документацией по Параметры ввода / вывода.

Надеюсь, это поможет!

1

Другие решения

Других решений пока нет …