2

根据GCM 文档,我们可以得到这种类型的结果消息:

{ "multicast_id": 216,
  "success": 3,
  "failure": 3,
  "canonical_ids": 1,
  "results": [
    { "message_id": "1:0408" },
    { "error": "Unavailable" },
    { "error": "InvalidRegistration" },
    { "message_id": "1:1516" },
    { "message_id": "1:2342", "registration_id": "32" },
    { "error": "NotRegistered"}
  ]
}

第二条消息有错误类型Unavailable,应该重新发送。根据文档,Retry-After如果标头包含在 GCM 服务器的响应中,我们应该尊重标头。

我有两个问题:

  1. Retry-After标题是否始终可用?也在响应状态200
  2. 在这种情况下,实际上是否有可能只重发一条消息?我应该只重新发送这条消息还是全部重新发送?
4

1 回答 1

2

1)

很难说。一方面,他们说,Retry-After当您遇到 500-599 范围内的错误时,这是​​可以预料的:

5xx

500-599 范围内的错误(例如 500 或 503)表示 GCM 服务器在尝试处理请求时出现内部错误,或者服务器暂时不可用(例如,由于超时)。发件人必须稍后重试,遵守响应中包含的任何 Retry-After 标头。应用程序服务器必须实现指数退避。

我检查了纯文本请求和 JSON 请求的响应标头,但没有得到Retry-Afterfor200响应。但是,我不知道如何模拟Unavailable错误,所以如果响应中出现此错误,他们可能会发送该标头。

2)

如果只有一条消息出现“不可用”错误(如您的示例响应中所示),则只应重新发送该消息。其余消息要么成功,要么失败,出现不需要重试的错误。因此他们不应该被怨恨。

于 2013-04-17T16:51:27.993 回答