2014-11-14 59 views
1
为POST

我读过很多和尝试使用与HTTP帖子很多HttpURLConnection类和几乎所有我遇到有类似的结构,这些三线开始:使用HttpURLConnection的Java中

url = new URL(targetURL); 
    connection = (HttpURLConnection)url.openConnection(); 
    connection.setRequestMethod("POST"); 

当我尝试我总是得到一个“已建立连接”例外呼叫setRequestMethod,这是非常有意义的,因为我在设置请求类型之前明确地调用openConnection。尽管阅读文档openConnection实际上并未打开理论上的连接。

在SO上有几个关于此问题的帖子,如thisthis。然而,我不明白为什么关于如何编写这段代码的每一条建议都有这三条命令。

我猜这个代码必须在大多数情况下工作,因为有人必须测试它,所以为什么这个代码不适合我?我应该如何编写此代码?

我知道这些是我可以在那里使用的其他库,我只是想知道为什么这不起作用。

+0

@scrappedcola我读过。问题是为什么这个代码不适合我,我该如何编写这段代码?如何在不调用openConnection的情况下创建连接?如果这是错的,为什么每个人都建议? – 2014-11-14 23:24:38

+0

@scrappedcola我已阅读文档。如何在不调用openConnection的情况下创建连接? – 2014-11-14 23:43:00

+0

@scrappedcola还有一点是文档状态:“应该指出的是,URLConnection实例在创建时不会建立实际的网络连接,只有在调用URLConnection.connect()时才会发生。”所以openConnection实际上并不连接。 – 2014-11-15 07:18:00

回答

1

为什么在这个问题的可疑代码已被复制所有在互联网上的东西,我不能回答。我也不能回答为什么它似乎适用于某些人而不是其他人。我现在可以回答其他问题,主要归功于Luiggi指出的this link

这里的关键是理解HttpURLConnection类的错综复杂。首次创建时,该类默认为“GET”请求方法,因此在此情况下无需更改任何内容。以下是相当不直观的,但要设置请求方法为“POST”你不应该调用setRequestMethod(“POST”),而是setDoOutput(true)隐式设置要发布的请求方法。一旦你完成了,你很好走。

下面,我相信,这是一个post方法应该是什么样子。这是用于发布json,但显然可以对其他内容类型进行更改。

public static String doPostSync(final String urlToRead, final String content) throws IOException { 
    final String charset = "UTF-8"; 
    // Create the connection 
    HttpURLConnection connection = (HttpURLConnection) new URL(urlToRead).openConnection(); 
    // setDoOutput(true) implicitly set's the request type to POST 
    connection.setDoOutput(true); 
    connection.setRequestProperty("Accept-Charset", charset); 
    connection.setRequestProperty("Content-type", "application/json"); 

    // Write to the connection 
    OutputStream output = connection.getOutputStream(); 
    output.write(content.getBytes(charset)); 
    output.close(); 

    // Check the error stream first, if this is null then there have been no issues with the request 
    InputStream inputStream = connection.getErrorStream(); 
    if (inputStream == null) 
     inputStream = connection.getInputStream(); 

    // Read everything from our stream 
    BufferedReader responseReader = new BufferedReader(new InputStreamReader(inputStream, charset)); 

    String inputLine; 
    StringBuffer response = new StringBuffer(); 

    while ((inputLine = responseReader.readLine()) != null) { 
     response.append(inputLine); 
    } 
    responseReader.close(); 

    return response.toString(); 
} 
+0

有什么不对吗?这个对我有用。 – EJP 2014-11-15 08:54:41

+0

@EJP据我所知,这没有什么不正确的。它包含不正确的代码的问题。 – 2014-11-15 09:27:49

0

根据https://stackoverflow.com/a/3324964/436524,您需要致电connection.setDoOutput(true)预计POST请求。

这使你的代码是这样的:

url = new URL(targetURL); 
    connection = (HttpURLConnection)url.openConnection(); 
    connection.setDoOutput(true); 
+1

还有[this q/a](http://stackoverflow.com/q/2793150/1065197) – 2014-11-14 23:29:30

+0

我仍然首先调用setDoOutput(true)得到相同的异常。 – 2014-11-14 23:36:02

+0

@LuiggiMendoza感谢您的有趣链接。这表明调用setDoOutput(true)将请求类型隐式设置为POST,因此不需要调用setRequestMethod。我不明白如此相同的不正确的代码可以在很多地方复制。 – 2014-11-14 23:44:51