即使设置了httpCon.setRequestMethod("GET"),HttpURLConnection仍会发送POST请求。

30

这是我的代码:

String addr = "http://172.26.41.18:8080/domain/list";

URL url = new URL(addr);
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setDoOutput(true);
httpCon.setDoInput(true);
httpCon.setUseCaches(false);
httpCon.setAllowUserInteraction(false);
httpCon.setRequestMethod("GET");
httpCon.addRequestProperty("Authorization", "Basic YWRtaW4fYFgjkl5463");

httpCon.connect();

OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());

System.out.println(httpCon.getResponseCode());
System.out.println(httpCon.getResponseMessage());

out.close();

我在响应中看到的内容:

500 服务器错误

我打开我的httpCon变量,看到的是:

POST /rest/platform/domain/list HTTP/1.1

为什么它设置为POST,即使我已经使用httpCon.setRequestMethod("GET");将其设置为GET?


基本身份验证是否通过POST方式传输? - cdeszaq
你是在 Galaxy Nexus 上进行测试吗?httpCon.setDoOutput(true); 在我的 Galaxy Nexus 上强制使用 POST,但在运行 Gingerbread 的 Galaxy S2 上没有。 - dzeikei
1个回答

70

httpCon.setDoOutput(true);这句代码隐式地将请求方法设置为POST,因为当你想要发送请求正文时,默认的方法就是POST。

如果你想使用GET方法,删除那行代码并且删除OutputStreamWriter out = new OutputStreamWriter(httpCon.getOutputStream());这行代码。对于GET请求,你不需要发送请求正文。

以下代码足以满足简单的GET请求:

String addr = "http://172.26.41.18:8080/domain/list";
URL url = new URL(addr);
HttpURLConnection httpCon = (HttpURLConnection) url.openConnection();
httpCon.setUseCaches(false);
httpCon.setAllowUserInteraction(false);
httpCon.addRequestProperty("Authorization", "Basic YWRtaW4fYFgjkl5463");
System.out.println(httpCon.getResponseCode());
System.out.println(httpCon.getResponseMessage());

参见:


与具体问题无关,您的Authorization头值中的密码部分似乎没有正确进行Base64编码。也许这是因为它是示例导致的混淆,但即使不是这样,我也会修复您的Base64编码方法。


据我所知,REST不强制要求GET请求没有请求体,可能存在合法的带有请求体的请求。 - mirage
@mirage:这并没有被REST规定,而且会被忽略。只有实现不良的服务器/API可能需要它。这是不可靠的。 - BalusC
但这是否意味着禁止使用呢?我的意思是,HttpURLConnection似乎禁止在GET请求中使用body,但这是非标准的吗?有许多库允许这种用法。 - mirage
@BalusC 在 Java 源代码中找不到任何证据表明 httpCon.setDoOutput(true); 将方法设置为 POST。 - Artem Novikov
@ArtemNovikov:http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/sun/net/www/protocol/http/HttpURLConnection.java/#1261 - BalusC
@BalusC 谢谢!我期望它直接发生在 setDoOutput 中。 - Artem Novikov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接