1、前言
最近有這麼一個經歷,我在A服務器中的java調用執行文件,並想將其返回值返回給B服務器的客戶端。當時在想A服務器暴露一個接口,然後使用runtime API調用即可,但是返回值這塊我卻有點苦惱。本意直接返回IO流,因爲生成的數據可大可小,無規律,但發現這樣是不可以的。
[org.springframework.http.converter.HttpMessageNotWritableException: No converter found for return value of type: class org.springframework.boot.loader.jar.JarURLConnection$2]
後來發現HttpServletResponse 可以解決這個問題。
2、HttpServletResponse 和HttpServletRequest
Web服務器收到客戶端的http請求,會針對每一次請求,分別創建一個用於代表請求的request對象、和代表響應的response對象。request和response對象即然代表請求和響應,那我們要獲取客戶機提交過來的數據,只需要找request對象就行了。要向客戶機輸出數據,只需要找response對象就行了。
本文主要講解HttpServletResponse,HttpServletRequest的合適應用場景補全。
HttpServletResponse
HttpServletResponse對象代表服務器的響應。這個對象中封裝了向客戶端發送數據、發送響應頭,發送響應狀態碼的方法。
他的作用如下
1、保存流對象
使用HttpServletResponse 我們可以將IO流讀出來在寫入HttpServletResponse中的OutputStream中。然後別的客戶端訪問的時候方便獲取
相關代碼
@RequestMapping(value = "/test")
@ResponseBody
public void testHdfs(String csv, String sql, HttpServletResponse response) {
BufferedInputStream bis = null;
try {
Process process = Runtime.getRuntime().exec("python /blazingsql/testData/zgh/aaa.py");
process.waitFor();
bis = new BufferedInputStream(process.getInputStream());
OutputStream os = null;
byte[] buff = new byte[1024];
os = response.getOutputStream();
int i = bis.read(buff);
while (i != -1) {
os.write(buff, 0, buff.length);
os.flush();
i = bis.read(buff);
}
} catch (IOException e) {
e.printStackTrace();
} catch (InterruptedException e) {
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2、下載文件
使用HttpServletResponse可以下載文件,很方便
設置這些參數很重要
response.setHeader(“Content-Disposition”, “attachment;filename=”+ URLEncoder.encode(“demo.csv”, “UTF-8”));
response.setHeader(“Connection”, “close”);
response.setHeader(“Content-Type”, “application/octet-stream”);
相關代碼
@RequestMapping(value = "/download")
@ResponseBody
public void download(String path,HttpServletResponse response) throws UnsupportedEncodingException {
response.reset();
response.setHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode("demo.csv", "UTF-8"));
response.setHeader("Connection", "close");
response.setHeader("Content-Type", "application/octet-stream");
OutputStream ops = null;
FileInputStream fis =null;
byte[] buffer = new byte[8192];
int bytesRead = 0;
try {
ops = response.getOutputStream();
fis = new FileInputStream(path);
while((bytesRead = fis.read(buffer, 0, 8192)) != -1){
ops.write(buffer, 0, bytesRead);
}
ops.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(fis != null){
fis.close();
}
if(ops != null){
ops.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}