根据GCM documentation我们可以得到这种类型的结果消息:
{ "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
header 包含在 GCM 服务器的响应中,我们应该尊重它。
我有两个问题:
Retry-After
header 始终可用吗?也在状态200
的响应中?- 实际上是否有可能像本例一样只重新发送一条消息?我应该只重新发送此消息还是全部消息?
最佳答案
1)
很难说。一方面,他们说当您收到 500-599 范围内的错误时,应该预期会发生 Retry-After
:
5xx
Errors in the 500-599 range (such as 500 or 503) indicate that there was an internal error in the GCM server while trying to process the request, or that the server is temporarily unavailable (for example, because of timeouts). Sender must retry later, honoring any Retry-After header included in the response. Application servers must implement exponential back-off.
我检查了纯文本请求和 JSON 请求的响应 header ,但没有收到 200
响应的 Retry-After
。但是,我不知道如何模拟 Unavailable
错误,因此如果响应中出现此错误,他们可能会发送该 header 。
2)
如果只有一条消息出现“不可用”错误(如您的示例响应中所示),则只应重新发送该消息。其余消息要么成功,要么失败并出现不需要重试的错误。因此他们不应该被怨恨。
关于android - GCM : Retry-After header,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16064185/