【发布时间】:2019-05-27 18:42:12
【问题描述】:
我正在尝试使用以下代码从 Android Studio 中的 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.RealBufferedSource$1 类型的对象。为什么getInputStream 没有按照Java documentation 返回InputStream?这是 android 特有的问题吗?
编辑:我自己定义了 ResponseBody 类(如下所示)。它不是来自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;
}
}
【问题讨论】:
-
仅供参考
HttpURLConnection.getInputStream()返回一个InputStream -
"我的 ResponseBody 类扩展了 InputStream,所以我认为使用。" -> 你指的是哪个响应体?这个 - square.github.io/okhttp/3.x/okhttp/okhttp3/ResponseBody.html。这不会根据文档扩展 InputStream。你想看看这个页面:developer.android.com/reference/java/net/HttpURLConnection
-
@RakeshRoy 实际上我自己定义了 ResponseBody 类。它是 InputStream 的一个简单扩展(见编辑)
标签: java android android-asynctask inputstream httpurlconnection