2011-10-27 77 views
0

我有一個httpclient獲取流式xls文件並將其寫入臨時文件。但是,該響應可能會返回200代碼的錯誤消息。錯誤消息的Java HttpClient檢查responseBody

是否有任何在寫入文件之前檢查responseBody流回的內容。

例如,如果出現錯誤,它將返回HTML,其中包含單詞ERROR。所以我想檢查一下,如果存在,退出該方法並將失敗代碼返回到前端。

前端使用從extjs網格內調用的AJAXRequest。

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 && 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); 
    } 

回答

0

響應應該有content-type標題。只是檢查,如果它是text/html,那麼這是一個錯誤,如果它是application/ms-excelapplication/vnd.ms-excel(不知道,檢查你的),那就是你想要的。此外,excel響應通常有content-disposition

+0

那麼我該如何告訴ajax請求它失敗?仍然不確定 – pm13

+0

只需使用'.xls'檢查失敗請求的響應標頭和正確的響應標頭。至少'content-type'應該是不同的。 – kan

+0

沒有我的意思是,即使返回錯誤,響應代碼始終爲200。我如何在httpclient中更改此內容,以便前端的ajax請求知道發生了錯誤? – pm13