【问题标题】:Podio API - Invalid token during project tasks syncPodio API - 项目任务同步期间的令牌无效
【发布时间】:2017-05-02 10:21:12
【问题描述】:

我们目前在尝试获取新任务时收到此 400 错误:

{"error_parameters":{},"error_detail":null,"error_propagate":false,"request":{"url":"http:\/\/api.podio.com\/task","query_string":"completed=true&completed_on=-5d&fields=completed_on&limit=100&offset=0&sort_by=rank&sort_desc=false&space=3798819","method":"GET"},"error_description":"Invalid token '(files,tags,votes)'","error":"invalid_value"}

您知道我们不会将其用于内部目的,而是有一个集成设置,允许任务同步和完成。

我们正在循环对所有空间任务进行分页:

get('/task', { space: project_link.remote_id, sort_by: 'rank', limit: limit, offset: offset, sort_desc: false, completed: completed, fields: 'completed_on' })

编辑:

def sync_project(project_link)
  existing_remote_ids = _synced_remote_task_ids(project_link.link_id)
  synced_project_ids = []
  [{completed: false}, {completed: true}].each do |params|
    offset = 0
    loop do
      tasks, next_offset = tasks_page_for_project(project_link: project_link, offset: offset, **params)
      tasks.each do |task|
        remote_task = map_podio_task(task, project_link.link_id)
        _process_task(remote_task)
        synced_project_ids << remote_task[:id].to_s
      end
      offset = next_offset
      break unless next_offset
    end
  end
  _mark_tasks_deleted(existing_remote_ids - synced_project_ids)
end

def tasks_page_for_project(project_link:, offset:, completed: false)
  next_offset = nil
  limit = 100
  params = { space: project_link.remote_id, sort_by: 'rank', limit: limit, offset: offset, sort_desc: false, completed: completed, fields: 'completed_on' }
  params[:completed_on] = '-5d' if completed
  tasks = get('/task', params)
  if tasks.size == limit
    next_offset = offset + limit
  end
  return tasks, next_offset
rescue TaskSync::ProjectRemovedError => ex
  raise TaskSync::ProjectRemovedError.new(self, project_link.remote_id), ex.message
rescue TaskSync::TemporaryNetworkError => ex
  ex.project_id = project_link.remote_id
  raise ex
end

def service
  check_token
  @service ||= build_client(href, 'Authorization' => "OAuth2 #{token[:token]}")
end

def authorization
  params = {
    grant_type: 'refresh_token',
    client_id: TaskSync.config[:podio][:client_id],
    client_secret: TaskSync.config[:podio][:client_secret],
    refresh_token: token[:refresh_token]
  }

  build_client 'https://podio.com/oauth/token', { 'Content-Type' => 'application/x-www-form-urlencoded' }, params
end

def href
  'https://api.podio.com'
end

而且这个错误只发生在单个客户端。

你能告诉我们这个错误是什么意思吗?是与 OAuth 相关还是与其他方面有关?

谢谢!

【问题讨论】:

  • 您能否提供代码示例,以便我尝试重现此问题?
  • 编辑了集成的最大部分。响应通过 JSON.parse(respone.body) 简单地解析,并根据状态码我们要么返回它,要么引发相应的错误。
  • 感谢样品。这似乎与 oAuth 无关,而是与如何检索任务的详细信息有关。您能否尝试一种可能的修复方法:将 '-5d' 替换为 '5_days' 或此处的其他可用选项:developers.podio.com/doc/tasks/get-tasks-77949(还有一种可能的修复方法:将 'files:false' 添加到参数列表中)
  • 感谢@Pavlo-Podio!我会尝试一下,并在几天后回复你,看看它是否仍然会发生。
  • 这方面有什么更新吗?

标签: podio


【解决方案1】:

感谢您报告 Podio 文档中发现的问题。这里有误导性(更新的文档已经发布)。

completed_on 字段的格式为 YYYY-MM-DD-YYYY-MM-DD
例如。对于 2017 年 6 月完成的所有任务:2017-06-01-2017-06-30

【讨论】:

  • 你确定吗??因为这个错误只是随机发生的,我不认为它与 completed_on 的格式有任何关系。而且你已经说过有不少于 3 种不同的语法风格。它遇到了很多,所以你甚至不知道您的 API 是如何工作的。随机更改 API 合同并且不支持旧语法 (-5d) 也是非常糟糕的。如果我们收到错误,那么这是您的 API 无法正常工作的问题。
  • 这个问题现在已经回答并接受了。 Podio 没有随机更改 API,但是在 3 个月前修复了任务相关操作的日期格式的误导性文档。 @Urkle - 如果您有类似的问题/问题 - 请在 SO 上提出新问题 :)
  • @Pavlo-Podio 在实现这个之后,我想到了一些在部署更改之前我们需要了解的情况: 1. 您在哪个时区解释 completed_on 过滤器? 2.您是否支持开放式过滤器(相当于> =)? (例如“2017-10-13-”) 3. 我们可以从现在起 +2 天后进行过滤(例如“2017-10-13-2017-10-20”)以解决任何时区异常吗?
  • @Pavlo-Podio ping.
  • @Pavlo-Podio 是的,我实现了它并且它适用于大多数情况,但我们希望确保我们已经涵盖了所有内容,因此我们不会让客户在同步期间从他们的项目中丢失任务.这就是我问上述问题的原因。
【解决方案2】:

你没有提到你在这里使用的编程语言是我在 PHP 上写的一个例子:

require_once 'podio/PodioAPI.php'; //podio library

error_log("validate triggerd");

$client_id = 'your client Id';
$client_secret = 'your client secret';
$app_id = 'your app id';
$app_token = 'your app token';

Podio::setup($client_id, $client_secret);
// Turn on debugging
Podio::$debug = true;

// Authenticate the app
Podio::authenticate('app', array('app_id' => $app_id, 'app_token' => $app_token));

并获得您的物品:

$tasks = PodioTask::get_all( $attributes = array() );

【讨论】:

  • 我们正在使用 ruby​​,问题不在于如何发出请求,而在于该错误的实际含义。我在问题中添加了ruby 标签,尽管这不应该有所作为。
猜你喜欢
  • 1970-01-01
  • 2021-06-10
  • 2016-01-14
  • 1970-01-01
  • 2016-05-24
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多