Я пытаюсь отправить HTTP-запрос с AsyncTask
в Android Studio, используя код ниже.
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();
будет работать, но вот проблема:
I 'Я получаю ClassCastException
в моем коде, потому что connection.getInputStream()
возвращает объект типа com.android.okhttp.okio.RealBufferedSource$1
.Почему getInputStream
не возвращает InputStream
согласно документации Java ?Это проблема для 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;
}
}