2011-10-27 19 views
0

私は、ストリームされたxlsファイルを取得し、それを一時ファイルに書き込むhttpclientを持っています。ただし、応答は200コードでエラーメッセージを返すことができます。Java HttpClient check responseBodyエラーメッセージ

responseBodyがファイルに書き込まれる前にストリームバックされているかどうかを確認する方法はありますか。

たとえば、エラーがある場合、ERRORという単語を含むHTMLが返されます。だから私は、それが存在する場合は、メソッドを終了し、フロントエンドに失敗コードを返すことを確認したいと思います。

フロントエンドは、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-excelまたはapplication/vnd.ms-excel(あなたのことを確認していません)の場合はエラーです。また、Excelレスポンスは通常content-dispositionです。

+0

どのようにしてajaxリクエストに失敗したと伝えますか?それでもまだ分かりません – pm13

+0

失敗したリクエストの応答ヘッダと '.xls'を使って正しいヘッダを調べてください。少なくとも 'content-type 'は異なっていなければなりません。 – kan

+0

私が言ったことはまったくありません、エラーが返されたとしても、応答コードは常に200です。フロントエンドのajaxリクエストがエラーが発生したことを知るように、これをhttpclientでどのように変更するのですか? – pm13