使用无效注册 ID 时 GCM 返回 BAD 请求

Posted

技术标签:

【中文标题】使用无效注册 ID 时 GCM 返回 BAD 请求【英文标题】:GCM returns BAD Request when invalid registration id is used 【发布时间】:2016-01-08 07:42:33 【问题描述】:

我们目前在测试 GCM 服务时遇到了一个奇怪的问题。

当我们发送一个有效的请求(带有一个有效的 registration_id)时,一切都很好,并且通知被发送到客户端应用程序。

然后我们想测试一种负面情况,我们使用了错误的 registration_id(我们只是交换了一个字母),然后 GCM 返回 400 BAD REQUEST 或 401 UNAUTHORIZED。

根据 GCM 文档,我们应该得到“200+error:InvalidRegistration”。

编辑 1:我们仅在对 GCM 的请求中使用“to”和“content_available”字段。 JSON 很好,否则它不适用于有效的 注册ID。

编辑 2: 我们发现,如果您手动更改注册 ID 的字母,您将收到错误请求作为响应。这意味着在 GCM 端可能会有一些验证来检查registration_id 是否被操纵。如果我们使用来自其他应用的registration_id,我们会收到来自GCM 的正常错误响应。

以前有人遇到过这个问题吗?

【问题讨论】:

【参考方案1】:

是的,你是对的。

但是;

如果您只发送一个带有 'to' 参数的令牌,GCM 会返回 400。

如果您尝试发送多个令牌(其中一些有效而另一些无效),GCM 将返回 200 并且错误列表具有“无效注册”代码。

作为这种情况,我可以说;

如果使用 'to',GCM 返回 400。

如果使用“registration_ids”,GCM 会返回 200 和错误列表作为响应。

您也可以使用this library's 测试用例进行检查。

【讨论】:

文档还提到,应从服务器中删除标有“InvalidRegistration”代码的registration_ids。现在如果我只发送 'to' 并且 GCM 返回 400,我还需要从服务器中删除 registration_id 吗? 作为文档;响应中描述了确切的失败原因,并且应该在重试请求之前解决问题。但我认为如果返回错误 400 则没有响应,所以如果你真的确定你的 json 格式是真的,是的,你可以从你的数据库中删除这个令牌。 测试库中提到的sender id是什么?这是生成注册令牌时也生成的发件人ID吗? 它是 server-api-key。变量名应该改变。例如:AIzaSyChYRRxDWCzlDvRykGYWYvZMZfO31hLBr

以上是关于使用无效注册 ID 时 GCM 返回 BAD 请求的主要内容,如果未能解决你的问题,请参考以下文章

始终从GCM中的php(服务器端)获取无效注册

AJAX请求返回HTTP 400 错误 - 请求无效 (Bad request)

GCM频繁刷新注册id

AJAX请求返回HTTP 400 错误 - 请求无效 (Bad request)

如何使用 asp.net 获得 GCM 注册 ID?

是否可以要求 GCM 服务器无法向过期/过时的注册 ID 推送通知?