HttpUrlConnection.getInputStream возвращает пустой поток в Android
Я делаю запрос GET на сервер с помощью HttpUrlConnection. После подключения:
- я получаю код ответа: 200
- я получаю ответное сообщение: OK
-
Я получаю входной поток, без исключения, но:
- в Автономной программе я получаю тело ответа, как и ожидалось:
{"имя": "мое имя", "День рождения": "01/01/1970","id": "100002215110084"}
- в Android деятельности, поток пуст (available() == 0), и поэтому я не могу получить любое сообщение.
любой намек или след? Спасибо.
EDIT: вот это код
обратите внимание: я использую import java.net.HttpURLConnection;
Это стандартная
библиотека http Java. я не хочу использовать любую другую внешнюю библиотеку. Фактически
У меня были проблемы в android, используя библиотеку httpclient от apache (некоторые из их анонимных .класс не может использоваться apk компилятор.)
Ну, код:
URLConnection theConnection;
theConnection = new URL("www.example.com?query=value").openConnection();
theConnection.setRequestProperty("Accept-Charset", "UTF-8");
HttpURLConnection httpConn = (HttpURLConnection) theConnection;
int responseCode = httpConn.getResponseCode();
String responseMessage = httpConn.getResponseMessage();
InputStream is = null;
if (responseCode >= 400) {
is = httpConn.getErrorStream();
} else {
is = httpConn.getInputStream();
}
String resp = responseCode + "n" + responseMessage + "n>" + Util.streamToString(is) + "<n";
return resp;
Я вижу:
200
OK
тело отклика
, но только
200 OK
в android
3 ответов
пробуя код Томислава, я получил ответ.
используется моя функция streamToString ().available () для определения наличия полученных данных, и он возвращает 0 в Android. Конечно, я позвонил слишком рано.
если я предпочитаю использовать readLine ():
class Util {
public static String streamToString(InputStream is) throws IOException {
StringBuilder sb = new StringBuilder();
BufferedReader rd = new BufferedReader(new InputStreamReader(is));
String line;
while ((line = rd.readLine()) != null) {
sb.append(line);
}
return sb.toString();
}
}
затем он ожидает поступления данных.
спасибо.
вы можете попробовать с этим кодом, который вернет ответ в строке:
public String ReadHttpResponse(String url){
StringBuilder sb= new StringBuilder();
HttpClient client= new DefaultHttpClient();
HttpGet httpget = new HttpGet(url);
try {
HttpResponse response = client.execute(httpget);
StatusLine sl = response.getStatusLine();
int sc = sl.getStatusCode();
if (sc==200)
{
HttpEntity ent = response.getEntity();
InputStream inpst = ent.getContent();
BufferedReader rd= new BufferedReader(new InputStreamReader(inpst));
String line;
while ((line=rd.readLine())!=null)
{
sb.append(line);
}
}
else
{
Log.e("log_tag","I didn't get the response!");
}
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return sb.toString();
}
потоковые данные могут быть не готовы, поэтому вы должны проверить в цикле, что данные в потоке доступны, прежде чем пытаться получить к нему доступ. Как только данные готовы, вы должны прочитать их и сохранить в другом месте, как массив байтов; объект двоичного потока-хороший выбор для чтения данных в виде массива байтов. Причина, по которой массив байтов является лучшим выбором, заключается в том, что данные могут быть двоичными данными, такими как файл изображения и т. д.
InputStream is = httpConnection.getInputStream();
byte[] bytes = null;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] temp = new byte[is.available()];
while (is.read(temp, 0, temp.length) != -1) {
baos.write(temp);
temp = new byte[is.available()];
}
bytes = baos.toByteArray();
В приведенном выше коде bytes
является ответом как байт матрица. Вы можете преобразовать его в строку, если это текстовые данные, например данные в кодировке UTF-8 текст:
String text = new String(bytes, Charset.forName("utf-8"));