2011-12-21 99 views
60

There's setDoOutput() in URLConnection。根据documentation我应该URLConnection.setDoOutput()究竟影响什么?

如果您打算使用URL连接输出,请将DoOutput标志设置为true,否则设置为false。

现在我面临exactly this problem - Java运行时将请求转换POST一旦setDoOutput(true)被调用,服务器只响应GET请求。我想了解如果从代码中删除setDoOutput(true)会发生什么情况。

这会影响到什么程度?假设我将它设置为false - 我现在能做什么以及现在不能做什么?我能否执行GET请求?这种方法的“输出”是什么?

回答

76

如果您想发送(输出)请求正文,例如POST或PUT请求,则需要将其设置为true。通过GET,你通常不会发送一个身体,所以你不需要它。

发送请求主体本身通过连接的输出流完成:

conn.getOutputStream().write(someBytes); 
+0

如果我正在下载映像,该怎么办? – Jaydev 2016-05-13 08:29:53

+0

正在下载?或上传? – Thilo 2016-05-13 08:43:31

24

setDoOutput(true)用于POSTPUT请求。如果是false那么它是用于使用GET请求。

+0

也可能是PUT。 – Thilo 2011-12-21 09:58:17

+0

@Thilo - 好点。 – 2011-12-21 09:58:39

+1

好吧,我怎么能强制这个连接做PUT,因为另一端的服务器只接受PUT请求,而不是POST ...? – 2012-07-05 10:54:09

0
public void setDoOutput(boolean dooutput) 

它需要一个值作为参数,并设置doOutput字段的此值对于此URLConnection为指定值。

URL连接可用于输入和/或输出。如果您打算使用URL连接输出,请将DoOutput标志设置为true,否则设置为false。默认值是false。

+3

我在提问之前已经阅读过文档。我问的原因是我没有得到那些影响。 – sharptooth 2011-12-21 10:00:12

+0

如果要写入连接对象,则必须将serDoOutput设置为true – 2011-12-21 10:15:11

1

添加评论,如果你有一个持久的连接,您同时发送GET和POST,这是我做的:

if (doGet) { // some boolean 
    con.setDoOutput(false); // reset any previous setting, if con is long lasting 
    con.setRequestMethod("GET"); 
} 
else { 
    con.setDoOutput(true); // reset any previous setting, if con is long lasting 
    con.setRequestMethod("POST"); 
} 

并且为了避免使连接持久,请每次关闭它。

if (doClose) // some boolean 
    con.setRequestProperty("Connection", "close"); 

con.connect();    // force connect request