Java HttpClient проверяет ResponseBody на наличие сообщения об ошибке

#java #file #io #httpclient #response

#java #файл #io #httpclient #ответ

Вопрос:

У меня есть httpclient, который получает потоковый файл xls и записывает его во временный файл. Однако ответ может возвращать сообщение об ошибке с кодом 200.

Есть ли способ проверить ResponseBody, переданный обратно, прежде чем он будет записан в файл.

Например, если есть ошибка, он вернет HTML со словом ERROR внутри него. Поэтому я хотел бы проверить это, если оно существует, выйдите из метода и верните код сбоя во внешний интерфейс.

Интерфейс использует ajaxRequest, вызываемый из сетки extjs.

  public void getReport(String login, String date, String type, String id){

        String url = "http://...";

        HttpClient client = new HttpClient();
        KerberizedNetegrityClient auth;       
        try {
            auth = new KerberizedNetegrityClient();
            cookie = auth.getCookieToken();
        } catch (NetegrityClientException e1) {
            // TODO Auto-generated catch block
            e1.printStackTrace();
        }


        GetMethod method = new GetMethod(url);

        method.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, new DefaultHttpMethodRetryHandler(3, false));
        method.setRequestHeader("Cookie", cookie);

        try{
            int statusCode = client.executeMethod(method);

            if(statusCode != HttpStatus.SC_OK){
                System.err.println("Method Failed: " method.getStatusLine());
            }
            file = "file.xls";
            InputStream is = method.getResponseBodyAsStream();
            BufferedInputStream bis = new BufferedInputStream(is);
            FileOutputStream fos = new FileOutputStream(file);
            byte[] bytes = new byte[8192];
            int count = bis.read(bytes);
            while(count != -1 amp;amp; count <= 8192){
                System.err.println("-");
                fos.write(bytes,0,count);
                count = bis.read(bytes);
            }
            if(count != -1){
                fos.write(bytes,0,count);                
            }
            fos.close();
            bis.close();
            method.releaseConnection();

            System.out.println("Done");



        }catch (HTTPException e){
            System.err.println("Fatal protocol violation: "  e.getMessage());
            e.printStackTrace();
        } catch (IOException e) {
            System.err.println("Fatal transport error: "  e.getMessage());
            e.printStackTrace();
        }finally{
            method.releaseConnection();
        }
        streamReport(file);
    }
  

Ответ №1:

Ответ должен иметь content-type заголовок. Просто проверьте, если это так text/html , то это ошибка, если это application/ms-excel или application/vnd.ms-excel (не уверен, проверьте свой), тогда это то, что вы хотите. Также обычно есть ответ Excel content-disposition .

Комментарии:

1. как мне затем сообщить ajax-запросу, что он не удался? Все еще не уверен в этом

2. Просто изучите заголовки ответа на неудачный запрос и на правильный с .xls помощью . По крайней content-type мере, должно быть по-другому.

3. нет, я имел в виду, что код ответа всегда равен 200, даже если возвращается ошибка. Как мне изменить это в httpclient, чтобы ajax-запрос во внешнем интерфейсе знал, что произошла ошибка?

4. 200 — это код состояния. Я говорю о заголовках ответов. Смотрите getResponseHeaders() метод.

5. если вы посмотрите на мой вопрос, я спрашиваю о «если он существует, выйдите из метода и верните код сбоя во внешний интерфейс»