📅  最后修改于: 2023-12-03 15:37:19.129000             🧑  作者: Mango
在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请求、响应的处理方式。同时,也要注意在使用该方法时进行异常处理,避免出现不可预知的错误。