【问题标题】:HTTP POST from java arrives as GET at server来自 java 的 HTTP POST 作为 GET 到达服务器
【发布时间】:2014-04-11 11:07:05
【问题描述】:

我有一个带有 CGI 的服务器,它将 REQUEST_METHOD 打印到 syslog。 我有可以 GET 和 POST 到该 CGI 的网页,这两种方法都可以打印我期望的内容。 我有一个可以 GET 到它的 java 程序。 但是当我尝试在 Java 中使用 POST 时:

URL url = new URL("https://192.168.10.178/mycgi");
conn = (HttpsURLConnection)url.openConnection();
conn.setDoOutput(true);
conn.setRequestMethod("POST"); // <- this bit!
InputStream is = conn.getInputStream();

结果是内容长度为零的 GET。 显然,我有更多的代码来设置内容类型和配置并将数据写入其中,但不管有没有其余部分,我仍然会收到到达服务器的 GET 请求。

我发现这里有人抱怨:

https://community.oracle.com/thread/1535571?start=0&tstart=0

很多人似乎有同样的问题,但没有答案,这里:

Android HTTP POST request sent from application but server "sees" it as a GET request

解决方案是使用 apache http 客户端的东西,如果可能的话,我宁愿避免使用它,因为它会向项目中添加一堆不需要它们的依赖项。

我有点不知所措,无法解释这一点。有人有什么建议吗?

【问题讨论】:

  • 已删除答案的重复评论:请求采用https://192.168.10.178/mycgi 的形式,并且绝对不包含?或 = 字符

标签: java android http post get


【解决方案1】:

确保您的服务器没有向最终目的地发送 302/301 响应。这可能会强制客户端将 POST 作为 GET 重新发送。

有关原因的解释,请参阅What is the correct behavior expected of an HTTP POST => 302 redirect to GET?

301/302 可能只是由于 URL 中缺少尾部斜杠。在 200 代码之前检查您的服务器日志中的 301/302 代码。

【讨论】:

  • 我不确定你所说的斜杠是什么意思 - 我试过 https://192.168.10.178/mycgi/ 并没有效果。但是,您对 302/301 的看法似乎是正确的,并且 https://192.168.10.178/path/cgi-bin/mycgi 正在工作。我想知道为什么网络浏览器可以工作,但我的 java 代码不能,但这回答了我的问题!谢谢。
猜你喜欢
  • 2017-10-18
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多