简体   繁体   中英

Java HttpConnection/HttpsConnection input/error stream

In java how do you know whether you have an error stream from a Http(s)connection or if it is an InputStream? The only way I can tell to do it is go for both, check for null and catch any exceptions.

    HttpConnection con = (HttpConnection)URL.openConnection();
    //Write to output
    InputStream in = con.GetInputStream();
    //Vs
    InputStream error = con.getErrorStream();

How does java determine which stream it has? Is it based solely on response code of the connetion? So if its >=200 and <300 then its inputStream otherwhise its an errorStream?

Thanks.

HTTP_INTERNAL_ERROR (500) isn't the only response code that can create an error stream, there are many others: 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 501, 502, 503, 504, 505, etc.

Not only that, but connection.getResponseCode() may throw an exception if it initiated the connection and the HTTP response status code was an error-class status code. So checking for 500 (HTTP_INTERNAL_ERROR) immediately after connection.getResponseCode() may actually be unreachable code, depending on how you're accessing connection .

The strategy I have seen implemented is to use the error stream if an exception was thrown, otherwise use the input stream. The following code provides a basic structural starting point . You'll probably want to add to it.

InputStream responseStream = null;
int responseCode = -1;
IOException exception = null;
try
{
    responseCode = connection.getResponseCode();  
    responseStream = connection.getInputStream();
}
catch(IOException e)
{
    exception = e;
    responseCode = connection.getResponseCode();  
    responseStream = connection.getErrorStream();    
}

// You can now examine the responseCode, responseStream, and exception variables
// For example:

if (responseStream != null)
{
    // Go ahead and examine responseCode, but
    // always read the data from the responseStream no matter what
    // (This clears the connection for reuse).
    // Probably log the exception if it's not null
}
else
{
    // This can happen if e.g. a malformed HTTP response was received
    // This should be treated as an error.  The responseCode variable
    // can be examined but should not be trusted to be accurate.
    // Probably log the exception if it's not null
}

You can do it as following:

InputStream inStream = null;  
int responseCode = connection.getResponseCode();  
if (responseCode == HttpURLConnection.HTTP_INTERNAL_ERROR) {            
    inStream = connection.getErrorStream();    
}  
else{  
    inStream = connection.getInputStream();  
}  

The HTTP return code signifies what is the kind of stream to read back.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM