使用Asana API缓慢响应

时间:2015-01-27 10:58:10

标签: php api asana

信息

我已经开始使用Asana API在我们的CMS中制作自己的任务概述。我在github上找到了一个API,这对我有很大帮助。 正如我在earlier question中提到的,我想为某个用户获取所有任务。我已经设法使用下面的代码执行此操作。

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的人,而且你们中的一些人可能在过去经历过同样的问题。

1 个答案:

答案 0 :(得分: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的参数,允许您指定所需的完全数据。例如:让我们假设对于教学任务,您真正想要的是知道任务ID,任务名称,它拥有的标签及其名称。然后你可以请求:

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

(包含的每个资源始终带有id字段)

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

希望有所帮助!