採用HttpServletResponse解決在A服務器調用python文件並返回值給B服務的客戶端的問題

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();
            }
        }
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章