Java HttpURLConnection放入Google云存储,出现错误403
我尝试使用XMLAPI将一个文件上传到Google云存储。我有正确的GoogleAccessId,有效期和签名为每次上传生成。奇怪的是,我可以使用Postman(Chrome应用程序)来放置文件,所以我确信URL是正确的。我就是不能用我的Android Java程序放它(它返回给我403错误)。执行上载的源代码位于此处(它基于以下代码:): PUT对象的文档:Java HttpURLConnection放入Google云存储,出现错误403,java,android,google-cloud-storage,httpurlconnection,put,Java,Android,Google Cloud Storage,Httpurlconnection,Put,我尝试使用XMLAPI将一个文件上传到Google云存储。我有正确的GoogleAccessId,有效期和签名为每次上传生成。奇怪的是,我可以使用Postman(Chrome应用程序)来放置文件,所以我确信URL是正确的。我就是不能用我的Android Java程序放它(它返回给我403错误)。执行上载的源代码位于此处(它基于以下代码:): PUT对象的文档: 有谁能研究一下这个问题并给我一些提示,这个问题可能出了什么问题吗?我刚刚发现,HttpURLConnection添加了Content-T
有谁能研究一下这个问题并给我一些提示,这个问题可能出了什么问题吗?我刚刚发现,
HttpURLConnection
添加了Content-Type
标题,其值为application/x-www-form-urlencoded
。我已经在android模拟器上使用HTTP嗅探器完成了这项工作
此自动添加的标头导致签名不匹配。在我更改服务器端的代码以允许具有内容类型的请求:application/x-www-form-urlencoded
之后,它生成了正确的签名,并且工作正常
感谢@morpheus05的支持。请像这样设置您的
内容类型
connection.setRequestProperty("Content-Type"," ");
因为HttpsUrlConnection
自动生成内容类型为
"Content-Type: application/x-www-form-urlencoded"
这将导致签名不匹配。最有可能的是您的android应用程序的副本未正确验证,而在chrome中您是(我假设您在chrome中登录了您的google帐户),我认为这不是重点,因为对于Postman来说,当我从我的任何帐户注销时,它也会起作用。必须有不同的根本原因,但我已经没有主意了。如果你使用签名URL,URL可能会被签名错误,我几乎可以肯定情况并非如此,因为相同的参数(包括签名URL)在Postman中有效,而在我的Android应用程序中则不会。我认为这个链接与你的问题有一些共同之处
"Content-Type: application/x-www-form-urlencoded"