2016-10-19 30 views
0

我想實現用資源嘗試處理POST請求的代碼。Java Post Connection使用試用資源

以下是我的代碼:

public static String sendPostRequestDummy(String url, String queryString) { 
    log.info("Sending 'POST' request to URL : " + url); 
    log.info("Data : " + queryString); 
    BufferedReader in = null; 
    HttpURLConnection con = null; 
    StringBuilder response = new StringBuilder(); 
    try{ 
     URL obj = new URL(url); 
     con = (HttpURLConnection) obj.openConnection(); 
     // add request header 
     con.setRequestMethod("POST"); 
     con.setRequestProperty("User-Agent", "Mozilla/5.0"); 
     con.setRequestProperty("Accept-Language", "en-US,en;q=0.5"); 
     con.setRequestProperty("Content-Type", "application/json"); 
     // Send post request 
     con.setDoOutput(true); 
     DataOutputStream wr = new DataOutputStream(con.getOutputStream()); 
     wr.writeBytes(queryString); 
     wr.flush(); 
     wr.close(); 
     int responseCode = con.getResponseCode(); 
     log.info("Response Code : " + responseCode); 
     if (responseCode >= 400) 
      in = new BufferedReader(new InputStreamReader(con.getErrorStream())); 
     else 
      in = new BufferedReader(new InputStreamReader(con.getInputStream())); 

     String inputLine; 

     while ((inputLine = in.readLine()) != null) { 
      response.append(inputLine); 
     } 
    }catch(Exception e){ 
     log.error(e.getMessage(), e); 
     log.error("Error during posting request"); 
    } 
    finally{ 
     closeConnectionNoException(in,con); 
    } 
    return response.toString(); 
} 

我的代碼如下擔憂:

  1. 怎樣在嘗試資源條件語句對於上述方案?
  2. 有沒有辦法在嘗試使用資源時傳遞連接? (可以使用嵌套的try-catch塊來完成,因爲URL和HTTPConnection不是AutoCloseable,它本身不是一個兼容的解決方案)
  3. 正在使用試用資源來解決上述問題是一種更好的方法嗎?

回答

0

1:您還可以在try內使用帶有資源語句的條件語句。不幸的是,您必須爲此塊定義新變量,並且不能使用預定義變量。 (在你的代碼變量in

try (BufferedReader in = (responseCode >= 400 ? new BufferedReader(new InputStreamReader(con.getErrorStream())) : new BufferedReader(new InputStreamReader(con.getInputStream())))) { 
    // your code for getting string data 
} 

2:我不知道HttpUrlConnectionAutoCloseable,所以它可能是一個好主意,致電disconnect()自己。我接受任何關於這個問題的建議。

3:try有資源,一定會幫助您管理資源。但是如果你確信你在使用後正確釋放資源,那麼你的代碼就沒問題了。

3

試試這個。

HttpURLConnection con = (HttpURLConnection) obj.openConnection(); 
try (AutoCloseable conc =() -> con.disconnect()) { 
    // add request headers 
    try (DataOutputStream wr = new DataOutputStream(con.getOutputStream())) { 
     wr.writeBytes(queryString); 
    } 
    int responseCode = con.getResponseCode(); 
    try (InputStream ins = responseCode >= 400 ? con.getErrorStream() : con.getInputStream(); 
     BufferedReader in = new BufferedReader(new InputStreamReader(ins))) { 
     // receive response 
    } 
} 

() -> con.disconnect()是在最後try語句的執行階段的一個con.disconnect() lambda表達式。

+0

這對我的大部分查詢都很好。但是,使用嵌套嘗試一個好方法?我的意思是我的代碼在try-catch-finally中正常工作。這種方法的優點是什麼? –

+0

@Chinmayjain如果您/某人複製代碼,它將顯示爲一個整體塊。 – Koshinae