Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/327.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java HttpURLConnection:无法检索正确的错误消息_Java_Ioexception_Http Status Code 400 - Fatal编程技术网

Java HttpURLConnection:无法检索正确的错误消息

Java HttpURLConnection:无法检索正确的错误消息,java,ioexception,http-status-code-400,Java,Ioexception,Http Status Code 400,我正在使用JavaHttpUrlConnection对象调用REST服务 当HTTP服务器返回任何业务错误时,我无法正确检索错误 例如,当我通过SoapUI调用REST服务时,我得到以下错误 <exception> <errors> <error> <diagnostic>Matching item with shortCode = 1089992001234 found</diagnostic> <

我正在使用JavaHttpUrlConnection对象调用REST服务

当HTTP服务器返回任何业务错误时,我无法正确检索错误

例如,当我通过SoapUI调用REST服务时,我得到以下错误

<exception>
    <errors>
    <error>
    <diagnostic>Matching item with shortCode = 1089992001234 found</diagnostic>
    <field>shortCode</field>
    <message>The Shortcode/CSG combination must be unique.</message>
    <objectFailingValidationClass>com.axiossystems.assyst.dto.organisationConfiguration.SectionDto</objectFailingValidationClass>
    <rule>isUniqueShortCodeWithCSG</rule>
    </error>
    </errors>
    <message>A complex validation error has been detected by the application.</message>
    <type>ComplexValidationException</type>
    </exception>
有人能告诉我如何捕获从服务器返回的业务错误吗?就像在SoapUI中收到的一样

下面是我的代码

try
    {
    url = new URL(targetURL);
    connection = (HttpURLConnection) url.openConnection();

    connection.setRequestProperty("accept", "application/xml");
    String userpassword = username + ":" + password;
    String authStringEnc = new String(Base64.encodeBase64(userpassword.getBytes()));

    connection.setRequestProperty("Authorization", "Basic "+authStringEnc);
    if (HttpMethod == "POST") 
    {
    connection.setRequestMethod("POST");
    //connection.setRequestProperty("Content-Length","" + Integer.toString(urlParameters.getBytes().length));
    connection.setRequestProperty("Content-Type", "application/xml");
    connection.setRequestProperty("Content-Language", "en-US");
    connection.setUseCaches(false);
    connection.setDoInput(true);
    connection.setDoOutput(true);
    OutputStream os = connection.getOutputStream();
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(os, "UTF-8"));
    writer.write(payLoad);
    writer.flush();
    writer.close();
    os.close();
    }
    int statusCode = connection.getResponseCode();


    System.out.println("--------000----------" + statusCode);           

    InputStream is = connection.getInputStream();
    System.out.println("--------111----------");            
    BufferedReader rd = new BufferedReader(new InputStreamReader(is));
    System.out.println("--------222----------");            
    String line;
    System.out.println("--------333----------");            
    StringBuffer response = new StringBuffer();
    System.out.println("--------444----------");            

    while ((line = rd.readLine()) != null) 
    {
    response.append(line);
    response.append('\r');
    }

    rd.close();
    return response.toString();
    }
    catch (Exception e) 
    {
    System.out.println("--------exception----------");          
    e.printStackTrace();
    return "";
    }

400错误表示您的响应数据格式不正确,表示格式不正确。请使用您的响应api再次检查。

如果出现错误(即httpStatusCode不是200),您可能需要读取HttpUrlConnection的errorStream,如下所示。阅读errorMessage后,您可以将其反序列化为与粘贴的xml输出匹配的DTO。请注意,下面的readErrorString()不完整,希望您仅将其用于参考

if (statusCode != 200) {
  InputStream errorStream = connection.getErrorStream();
  String errorMessage = (errorStream != null) ? readErrorString(errorStream) : connection
                .getResponseMessage();
}
private void readErrorString(InputStream is) {
  String responseString = null;
  BufferedInputStream bis = null;
  try {
    StringBuilder sb = new StringBuilder();
    bis = new BufferedInputStream(inputStream);
    byte[] byteContents = new byte[4096];
    int bytesRead;
    String strContents;
    while ((bytesRead = bis.read(byteContents)) != -1) {
        strContents = new String(byteContents, 0, bytesRead, "UTF-8"); // You might need to replace the charSet as per the responseEncoding returned by httpurlconnection above
            sb.append(strContents);
    }
    responseString = sb.toString();
} finally {
    if (bis != null) {
        bis.close();
        }
    }
}

回报率

意思是“坏请求”。服务器发送响应。你的回答没有道理。
if (statusCode != 200) {
  InputStream errorStream = connection.getErrorStream();
  String errorMessage = (errorStream != null) ? readErrorString(errorStream) : connection
                .getResponseMessage();
}
private void readErrorString(InputStream is) {
  String responseString = null;
  BufferedInputStream bis = null;
  try {
    StringBuilder sb = new StringBuilder();
    bis = new BufferedInputStream(inputStream);
    byte[] byteContents = new byte[4096];
    int bytesRead;
    String strContents;
    while ((bytesRead = bis.read(byteContents)) != -1) {
        strContents = new String(byteContents, 0, bytesRead, "UTF-8"); // You might need to replace the charSet as per the responseEncoding returned by httpurlconnection above
            sb.append(strContents);
    }
    responseString = sb.toString();
} finally {
    if (bis != null) {
        bis.close();
        }
    }
}