#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. если вы посмотрите на мой вопрос, я спрашиваю о «если он существует, выйдите из метода и верните код сбоя во внешний интерфейс»