Java 为什么HttpURLConnection的getInputStream()方法返回RealBufferedSource类型的对象?
我正在尝试使用下面的代码从Android Studio中的Java 为什么HttpURLConnection的getInputStream()方法返回RealBufferedSource类型的对象?,java,android,android-asynctask,inputstream,httpurlconnection,Java,Android,Android Asynctask,Inputstream,Httpurlconnection,我正在尝试使用下面的代码从Android Studio中的AsyncTask发送HTTP请求 protected Long doInBackground(URL... urls) { try { HttpURLConnection connection = (HttpURLConnection) urls[0].openConnection(); connection.setRequestMethod("POST"); connection
AsyncTask
发送HTTP请求
protected Long doInBackground(URL... urls) {
try {
HttpURLConnection connection = (HttpURLConnection) urls[0].openConnection();
connection.setRequestMethod("POST");
connection.connect();
byte[] loginRequestBytes = new Gson().toJson(loginRequest, LoginRequest.class).getBytes();
connection.getOutputStream().write(loginRequestBytes);
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
ResponseBody responseBody = (ResponseBody) connection.getInputStream(); // ResponseBody extends InputStream
loginResponse = new Gson().fromJson(responseBody.toString(), LoginResponse.class);
}
} catch (IOException e) {
Log.e("HttpClient", e.getMessage(), e);
}
return null;
}
我的ResponseBody
类扩展了InputStream
,因此我认为
ResponseBody responseBody = (ResponseBody) connection.getInputStream();
这会起作用,但问题是:
我的代码中有一个ClassCastException
,因为connection.getInputStream()
返回类型为com.android.okhttp.okio.realburedSource$1的对象。为什么getInputStream
没有按照返回InputStream
?这是安卓特有的问题吗
编辑:我自己定义了ResponseBy类(如下所示)。它是而不是okhttp
中的,据我所知,它确实扩展了InputStream
public class ResponseBody extends InputStream {
@Override
public String toString() {
StringBuilder stringBuilder = new StringBuilder();
String line;
try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(this, "UTF-8"))) {
while ((line = bufferedReader.readLine()) != null) {
stringBuilder.append(line);
}
} catch (IOException e) {
e.printStackTrace();
}
return stringBuilder.toString();
}
@Override
public int read() throws IOException {
return 0;
}
}
getInputStream()
方法确实返回一个InputStream
。但您正试图将结果强制转换为响应库
。除非结果对象是ResponseBody
的子类型的实例,否则这将不起作用。。。但事实并非如此
现在,不清楚您试图在这里使用哪个ResponseBody
类,但是如果它是okhttp3.ResponseBody
(),那么您无法通过强制转换输入流来获得它
实际上,我自己定义了ResponseBody
类。它是InputStream
的一个简单扩展(请参见编辑),因此我认为向下转换应该可以工作
啊。我明白了
不,那不行。不能将对象强制转换为它不是的类型。这不是类型转换所做的。。。对于引用类型
您有一个匿名内部类的实例
com.android.okhttp.okio.RealBufferedSource$1
它是InputStream
的子类型。您正试图将其强制转换为响应库
,该响应库也是输入流
的子类型。但是ResponseBody
不是匿名类的超类或接口,因此类型转换无法成功
我建议您将ResponseBody
重写为InputStream
的包装类和/或使用此处列出的解决方案之一,将InputStream
的内容提取为字符串
:
这可能有助于您了解HttpURLConnection.getInputStream()
返回一个InputStream
“我的ResponseBy类扩展了InputStream,所以我想使用。”->您指的是哪个响应体?这个-。这不会根据文档扩展InputStream。你想看看这个页面吗:@RakeshRoy我实际上自己定义了ResponseBody类。这是InputStream的一个简单扩展(请参见编辑),感谢您的回答!实际上,我自己定义了ResponseBody类。它是InputStream的一个简单扩展(请参见编辑),因此我认为向下转换应该可以工作