HttpUrlConnection.getInputStream возвращает пустой поток в Android

Я делаю запрос GET на сервер с помощью HttpUrlConnection. После подключения:

  1. я получаю код ответа: 200
  2. я получаю ответное сообщение: OK
  3. Я получаю входной поток, без исключения, но:

    • в Автономной программе я получаю тело ответа, как и ожидалось:

    {"имя": "мое имя", "День рождения": "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"));