URLConnection FileNotFoundException for non-standard HTTP port sources

后端 未结 8 936
野性不改
野性不改 2020-11-29 04:30

I was trying to use the Apache Ant Get task to get a list of WSDLs generated by another team in our company. They have them hosted on a weblogic 9.x server on http://....co

相关标签:
8条回答
  • 2020-11-29 05:32

    The response to my HTTP request returned with a status code 404, which resulted in a FileNotFoundException when I called getInputStream(). I still wanted to read the response body, so I had to use a different method: HttpURLConnection#getErrorStream().

    Here's a JavaDoc snippet of getErrorStream():

    Returns the error stream if the connection failed but the server sent useful data nonetheless. The typical example is when an HTTP server responds with a 404, which will cause a FileNotFoundException to be thrown in connect, but the server sent an HTML help page with suggestions as to what to do.

    Usage example:

    public static String httpGet(String url) {
        HttpURLConnection con = null;
        InputStream is = null;
        try {
            con = (HttpURLConnection) new URL(url).openConnection();
            con.connect();
    
            //4xx: client error, 5xx: server error. See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html.
            boolean isError = con.getResponseCode() >= 400;
            //In HTTP error cases, HttpURLConnection only gives you the input stream via #getErrorStream().
            is = isError ? con.getErrorStream() : con.getInputStream();
    
            String contentEncoding = con.getContentEncoding() != null ? con.getContentEncoding() : "UTF-8";
            return IOUtils.toString(is, contentEncoding); //Apache Commons IO
        } catch (Exception e) {
            throw new IllegalStateException(e);
        } finally {
            //Note: Closing the InputStream manually may be unnecessary, depending on the implementation of HttpURLConnection#disconnect(). Sun/Oracle's implementation does close it for you in said method.
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    throw new IllegalStateException(e);
                }
            }
            if (con != null) {
                con.disconnect();
            }
        }
    }
    
    0 讨论(0)
  • 2020-11-29 05:32

    You could use OkHttp:

    OkHttpClient client = new OkHttpClient();
    
    String run(String url) throws IOException {
      Request request = new Request.Builder()
          .url(url)
          .build();
    
      Response response = client.newCall(request).execute();
      return response.body().string();
    }
    
    0 讨论(0)
提交回复
热议问题