Java HTTPResponse возвращает ноль - PullRequest
0 голосов
/ 16 января 2019

Я пытаюсь прочитать ответ API с помощью запроса GET. URL - это строка, которая создается в другом классе и передается. Я подтвердил, что создаваемые URL действительны и работают, но возвращаемое значение равно нулю. Странно то, что он работает один раз правильно, когда я делаю другой вызов, но каждый раз, когда он вызывается после первого, он возвращает только ноль.

Вот пример вызова API, который я передаю своей функции:

https://api.smmry.com/?SM_API_KEY=key&SM_URL=https://www.thehindubusinessline.com/news/variety/long-way-before-ai-systems-take-over-humans-jobs-study/article25938621.ece

Я проверил это, и он возвращает то, что я ожидаю в браузере. Вот код, который возвращает ноль:

public String getResponse(String url)  {
        HttpClient client = null;
        String line = "";
        try {
            client = new DefaultHttpClient();
            HttpGet request;
            request = new HttpGet(url);
            HttpResponse response = client.execute(request);
            //Check if the response code is not 200
            if (response.getStatusLine().getStatusCode() != 200) {
                Logger.error(response.getStatusLine().getStatusCode());
                return "Error";
            }
              BufferedReader rd = new BufferedReader (new InputStreamReader(response.getEntity().getContent()));
              while (rd.readLine() != null) {
                  line = line + rd.readLine();
              }
        } catch (Exception e) {
            Logger.error(e);
        } 
        return line;
    }

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Обратите внимание, что для каждой итерации цикла читаются две строки из rd. В начале цикла while (rd.readLine() != null) метод readLine() возвращает текущую строку в rd и устанавливает маркер итератора на следующей строке. Затем, когда readLine() вызывается во второй раз, rd возвращает следующую строку и объединяет ее со значением line. Поскольку ответ на ваш запрос содержит только одну строку, второй вызов readLine() возвращает null, цикл тормозит, и строка возвращается со значением null.

Вам следует сохранить значение, возвращенное при первом вызове, в readLine() и использовать StringBuilder для объединения.

            StringBuilder builder = new StringBuilder();
            BufferedReader rd = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
            String line;
            while ((line = rd.readLine()) != null) {
                builder.append(line);
            }
            responseBody = builder.toString();
   .
   .
   .
return responseBody;
0 голосов
/ 16 января 2019
while (rd.readLine() != null) {
    line = line + rd.readLine();
}

Делая это, вы пропускаете одну строку из двух.Наиболее распространенное использование BufferedReader:

String line = null;
while ( (line = reader.readLine())!=null ) {
    buffer += line;
}
// buffer contains the whole text
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...