使用 Asana 反应缓慢 API

Slow responses using the Asana API

信息

我已经开始使用 Asana API 在我们的 CMS 中制作我们自己的任务概览。我在 github 上找到了一个 API,这对我有很大帮助。 正如我在 中提到的,我想获取某个用户的所有任务。我已经使用下面的代码成功地做到了这一点。

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 秒,这仍然太长了。现在,我希望我不是第一个使用 Asana 的人 API,并且你们中的一些人过去可能遇到过同样的问题。

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 的参数,可让您指定所需的 exact 数据。例如:假设对于教学任务,您真正想要的只是知道任务 ID、任务名称、它具有的标签及其名称。然后你可以请求:

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

(包含的每个资源总是带有其 id 字段)

这将允许您在单个 HTTP 请求中获取您想要的所有数据。 (好吧,用户查找仍然是分开的,但至少那只是 1 个额外请求而不是 N 个)。有关 opt_fields 的更多信息,请查看有关 Input/Output Options 的文档。

希望对您有所帮助!