Есть ли способ получить строковое значение HttpEntity, когда EntityUtils.toString() возвращает исключение?

Я продолжаю сталкиваться с этой ситуацией, когда я получаю плохой ответ HTTP (например, 400), но не могу посмотреть HttpEntity в объекте HttpResponse. Когда я выполняю отладчик, я вижу, что сущность имеет содержимое (длина > 0), и я даже могу просмотреть содержимое, но все, что я вижу, — это массив чисел (я полагаю, коды ASCII?), который не является полезный. Я вызову EntityUtils.toString() для объекта, но я верну исключение — либо IOException, либо какое-то исключение «объект находится в недопустимом состоянии». Это действительно расстраивает! Есть ли способ получить этот контент в удобочитаемой форме?

Вот мой код:

    protected JSONObject makeRequest(HttpRequestBase request) throws ClientProtocolException, IOException, JSONException, WebRequestBadStatusException {

    HttpClient httpclient = new DefaultHttpClient();

    try {
        request.addHeader("Content-Type", "application/json");
        request.addHeader("Authorization", "OAuth " + accessToken);
        request.addHeader("X-PrettyPrint", "1");

        HttpResponse response = httpclient.execute(request);
        int statusCode = response.getStatusLine().getStatusCode();

        if (statusCode < 200 || statusCode >= 300) {
            throw new WebRequestBadStatusException(statusCode);
        }

        HttpEntity entity = response.getEntity();

        if (entity != null) {
            return new JSONObject(EntityUtils.toString(entity));
        } else {
            return null;
        }

    } finally {
        httpclient.getConnectionManager().shutdown();
    }
}

Видите, где я выбрасываю исключение? Что я хотел бы сделать, так это высосать содержимое HttpEntity и поместить его в исключение.


person sangfroid    schedule 30.08.2011    source источник
comment
Если преобразование строк не удается, вы всегда можете получить необработанные байты с помощью EntityUtils.toByteArray() и самостоятельно создать шестнадцатеричный дамп этих байтов.   -  person hmakholm left over Monica    schedule 30.08.2011
comment
Да, я думал об этом. Знаете какие-нибудь утилиты, которые берут тип [100, 21, 45, 22] вывода, который мы получаем от отладчика, и превращают его во что-то удобочитаемое?   -  person sangfroid    schedule 30.08.2011
comment
Попробуйте конструктор String: download.oracle.com/javase/1,5.0/docs/api/java/lang/, java.lang.String)   -  person Lauri Piispanen    schedule 01.09.2011


Ответы (4)


Appache уже предоставил класс Util для этого под названием EntityUtils.

String responseXml = EntityUtils.toString(httpResponse.getEntity());
EntityUtils.consume(httpResponse.getEntity());
person Ahmad Nadeem    schedule 11.10.2016

Вот некоторый код для просмотра объекта в виде строки (учитывая, что ваш запрос contentType имеет формат html или аналогичный):

   String inputLine ;
 BufferedReader br = new BufferedReader(new InputStreamReader(httpResponse.getEntity().getContent()));
 try {
       while ((inputLine = br.readLine()) != null) {
              System.out.println(inputLine);
       }
       br.close();
  } catch (IOException e) {
       e.printStackTrace();
  }
person JaVaBoy    schedule 31.08.2011

Чтобы включить удобочитаемую форму, вы можете преобразовать HttpEntity в строку с кодом UTF-8.

EntityUtils.toString(response.getEntity(), "UTF-8")

Это даст вам параметры ответа в форме json, например:

{ "ошибка": { "ошибки": [ { "домен": "глобальный", "причина": "запрещено", "сообщение": "запрещено" } ], "код": 403, "сообщение": "запрещено " }}

Надеюсь, это решит проблему.

person Anand Tuli    schedule 11.07.2018

В общем, если вы хотите преобразовать свой DTO в формат String, вы можете использовать ObjectMapper. Пожалуйста, найдите следующий пример, если он полезен.

public static String getObjectAsString(Object object) {
    ObjectMapper mapper = new ObjectMapper();
    try {
        return mapper.writeValueAsString(object);
    } catch (Exception e) {
        return null;
    }
}
person Sumanth Varada    schedule 31.05.2019