2016-04-29 110 views
0

我正在嘗試將用戶註冊到我的Web服務器。如果我向服務器發送有效的詳細信息,那麼我會收到代表「已創建」的201代碼。但是,當我發送錯誤的憑據到服務器,即相同的用戶名,那麼我得到400 FileNotFoundException。我需要解釋錯誤細節不僅400個代碼。因爲如果我使用curl從命令行發送錯誤的細節,那麼我也會得到錯誤的細節,例如這個用戶名已經存在。 這裏是我的代碼來讀取服務器的響應。其實我試過兩種不同的方法,但它們都以400(壞請求)相同的錯誤結束。如何從REST API讀取錯誤詳細信息

public static String readResponse(HttpURLConnection connection) 
     throws IOException, JSONException { 

    InputStream is = connection.getInputStream(); 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
    String line; 
    StringBuilder response = new StringBuilder(); 
    while((line = rd.readLine()) != null) { 
     response.append(line); 
     response.append('\r'); 
    } 
    return response.toString(); 
} 

public static String readResponseFromServer(HttpURLConnection connection) throws IOException { 
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader 
      (connection.getInputStream())); 
    String line = ""; 
    StringBuilder stringBuilder = new StringBuilder(); 
    while ((line = bufferedReader.readLine()) != null) { 
     stringBuilder.append(line).append("\n"); 
    } 
    return stringBuilder.toString(); 
} 

在上面的代碼中,有兩種讀取服務器響應的方法。

這裏是我正在如何使用這些方法來從服務器讀取

System.out.println("Server Response" + WebServiceHelpers.readResponseFromServer(urlConnection)); 

響應,我也使用第二方法,該方法是readResponse()從上面的代碼。

這裏是curl命令的截圖,其中我向服務器發送錯誤的細節並獲取錯誤的詳細信息。

Server Response using curl

我也有HTTPIE嘗試這樣做,我也得到儘可能使用curl命令即用戶與該用戶名已經存在同樣的反應。

我在我的Java代碼中也需要這些錯誤細節。我搜索了互聯網,但沒有找到解決方案。 有什麼建議嗎?

回答

0

試試這個

public static String readResponse(HttpURLConnection connection) 
    throws IOException, JSONException { 
    int respCode = connection.getResponseCode(); 

    InputStream is = null; 
    if (isErrorCode(respCode)) { 
     is = connection.getErrorStream(); 
    } else if (connection.getErrorStream() != null) { 
     is = connection.getInputStream(); 
    } 
    //FIXME: InputStreamReader must be constructed with right charset 
    BufferedReader rd = new BufferedReader(new InputStreamReader(is)); 
    String line; 
    StringBuilder response = new StringBuilder(); 
    while((line = rd.readLine()) != null) { 
     response.append(line); 
    } 
    return response.toString(); 
} 

寫isErrorCode方法。它應該根據需要將響應代碼400解釋爲錯誤和其他代碼。還請注意fixme評論。在構建沒有字符集的InputStreamReader時,它使用默認字符集(如果不提供file.encoding屬性,則使用UTF-8),但正確的方法是使用該編碼從Content-Type響應標頭和流程響應主體獲取字符集。從響應中提取字符集的方法可能看起來像這樣

private String getCharset(HttpURLConnection con) { 
    String charset = ""; 

    String contentType = con.getContentType(); 
    if (contentType != null) { 
     String[] values = contentType.split(";"); 
     for (String value : values) { 
      String trimValue = value.trim(); 

      if (trimValue.toLowerCase().startsWith("charset=")) { 
       charset = trimValue.substring("charset=".length()); 
      } 
     } 
    } 
    if ("".equals(charset)) { 
     charset = "UTF-8"; 
    } 

    return charset; 
}