Java Google GCM中的HTTP响应代码401

Java Google GCM中的HTTP响应代码401,java,google-cloud-messaging,Java,Google Cloud Messaging,下面是我得到的例外,即使我的服务器和浏览器应用程序API密钥有效。我用卷发检查了一下。我以UTF-8和JSON两种格式发送GCM请求。从外部公司网络进行测试 java.io.IOException: Server returned HTTP response code: 401 for URL: https://android.googleapis.com/gcm/send at sun.reflect.NativeConstructorAccessorImpl.newInsta

下面是我得到的例外,即使我的服务器和浏览器应用程序API密钥有效。我用卷发检查了一下。我以UTF-8和JSON两种格式发送GCM请求。从外部公司网络进行测试

java.io.IOException: Server returned HTTP response code: 401 for URL: https://android.googleapis.com/gcm/send
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:513)
        at sun.net.www.protocol.http.HttpURLConnection$6.run(HttpURLConnection.java:1345)
        at java.security.AccessController.doPrivileged(Native Method)
        at sun.net.www.protocol.http.HttpURLConnection.getChainedException(HttpURLConnection.java:1339)
        at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:993)
        at java.net.URLConnection.getContent(URLConnection.java:688)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getContent(HttpsURLConnectionImpl.java:406)
        at gcm1.MessageUtil.sendMessage(MessageUtil.java:58)

我可以知道原因和解决方案吗?

以下是使用GCM时401错误的可能原因:

无法验证您试图用于发送邮件的发件人帐户。可能的原因有:

  • 授权标头缺失或语法无效
  • 作为密钥发送的项目ID无效
  • 密钥有效,但已禁用GCM服务
  • 来自服务器密钥IP中未列出白名单的服务器的请求
检查您在授权标头中发送的令牌是否是与项目关联的正确API密钥


来源:

在我的例子中,问题是在数据仓库中设置正确的API密钥后忘记重新部署。

<强>请按照下面的指令进行排序,这可能对您有帮助。>P/> 更新:从GCM迁移到FCM似乎也解决了401未授权错误的问题

如果您刚刚开始使用GCM,而不是在Google开发者控制台中创建项目,请在Firebase控制台中进行。创建项目后,只需使用自动生成的服务器密钥。以下是查找服务器密钥的步骤:

  • 转到Firebase控制台并单击创建新项目
  • 填写您想要的项目名称并选择您的国家/地区。此后,, 新项目应处于活动状态
  • 然后在左侧面板上,单击齿轮按钮并选择项目 设置
  • 然后转到云消息选项卡
  • 对于旧GCM项目,只需将项目导入Firebase控制台即可:

  • 转到Firebase控制台并单击导入项目
  • 选择要导入的项目和所在国家/地区
  • 单击AddFirebase。在此之后,新项目应处于活动状态
  • 然后在左侧面板上,单击齿轮按钮并选择项目 设置
  • 然后转到云消息选项卡

  • 我使用curl检查了我的API键,它工作正常。它以JSON格式返回成功响应:1。服务器在服务器密钥IPs中也被列为白名单。让我明白的是,Google要求您在“授权”标题中用“Key=”作为API密钥的前缀。这对我来说毫无意义(它已经在标题字段中;使用'key='是多余的),但一旦我在中添加了它,问题就解决了。更新的链接:对于刚才浏览的其他人,如果您突然开始遇到此错误而没有做任何特定更改(服务器密钥),则仍然相同,您可能需要将项目导入Firebase。看看我的答案。