【问题标题】:Slow responses using the Asana API使用 Asana API 响应缓慢
【发布时间】:2015-01-27 10:58:09
【问题描述】:

信息

我已经开始使用 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 的人,而且你们中的一些人过去可能遇到过同样的问题。

【问题讨论】:

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

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

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

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

    希望有帮助!

    【讨论】:

    • 这对我最初的做法确实是一个很大的改进。非常感谢。这大大加快了速度。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-13
    • 1970-01-01
    • 1970-01-01
    • 2018-04-19
    • 2021-08-17
    相关资源
    最近更新 更多