Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/361.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpURLConnection放入Google云存储,出现错误403_Java_Android_Google Cloud Storage_Httpurlconnection_Put - Fatal编程技术网

Java HttpURLConnection放入Google云存储,出现错误403

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

我尝试使用XMLAPI将一个文件上传到Google云存储。我有正确的GoogleAccessId,有效期和签名为每次上传生成。奇怪的是,我可以使用Postman(Chrome应用程序)来放置文件,所以我确信URL是正确的。我就是不能用我的Android Java程序放它(它返回给我403错误)。执行上载的源代码位于此处(它基于以下代码:):

PUT对象的文档:


有谁能研究一下这个问题并给我一些提示,这个问题可能出了什么问题吗?

我刚刚发现,
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"