📜  在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:251) - Java (1)

📅  最后修改于: 2023-12-03 15:37:19.129000             🧑  作者: Mango

在 com.android.okhttp.internal.huc.HttpURLConnectionImpl.getInputStream(HttpURLConnectionImpl.java:251) - Java

在Java开发中,我们经常使用HttpURLConnectionImpl类来进行HTTP请求。其中,HttpURLConnectionImpl.getInputStream方法用于获取HTTP响应的输入流。

在该方法中,使用了OkHttp库的com.android.okhttp.internal.huc包下的HttpURLConnectionImpl类。该类是对Java自带的HttpURLConnection类进行的封装,提供更加易用、高效的HTTP请求方式。

在InputStream获取的过程中,如果出现异常,就会抛出IOException。在调用该方法时,应充分考虑可能出现的异常,进行异常处理。

以下是HttpURLConnectionImpl.getInputStream方法的代码片段:

public synchronized InputStream getInputStream() throws IOException {
        checkResponse();
        if (doOutput || method.equals("GET")) {
            // ...
        }

        // 获取输入流
        if (!inputStreamRequested) {
            inputStreamRequested = true;

            try {
                // 发送请求
                getResponseCode();
            } catch (IOException ex) {
                // ...
            }
        }

        if (cachedInputStream != null) {
            // ... 
        }

        if (httpEngine.hasResponseBody()) {
            if (responseTransferEncoding != null
                    && responseTransferEncoding.equalsIgnoreCase("chunked")) {
                // ...

                return new ChunkedInputStream(httpEngine.getResponse().body().source(), this);
            } else {
                // ...

                return new FixedLengthInputStream(httpEngine.getResponse().body().source(), contentLength(), this);
            }
        } else {
            return EmptyInputStream.INSTANCE;
        }
    }

可以看到,该方法首先通过checkResponse()方法来检查响应是否存在,如果不存在就会抛出IllegalStateException异常。

然后,根据请求方法进行不同的处理。如果是GET请求或者需要输出请求数据,就会进行相应的处理。接下来,会判断是否已经请求过输入流。如果没有,就会发送请求以获取响应码。

最终,根据响应是否有响应体来返回不同的InputStream的子类,例如ChunkedInputStream、FixedLengthInputStream等。

因此,通过了解HttpURLConnectionImpl类的getInputStream方法,我们可以更好地理解HttpURLConnection的底层实现和HTTP请求、响应的处理方式。同时,也要注意在使用该方法时进行异常处理,避免出现不可预知的错误。