2014-11-14 58 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