• Illegal character ((CTRLCHAR, code 31))问题排查 gzip接口返回 RestTemplate GET POST请求


    Illegal character ((CTRL-CHAR, code 31))问题排查 gzip接口返回

    #接口返回gzip方式
    private static final String ENCODING_UTF8 = "UTF-8";
    private static ObjectMapper mapper = new ObjectMapper();
    
    private void writeResponse(HttpServletResponse response, Object outJB){
            response.setHeader("Access-Control-Allow-Origin","*");
            response.setContentType("text/html; charset=utf-8");
            //response.setContentType("application/json; charset=utf-8");
            //response.setContentType("text/json; charset=utf-8");
            response.setCharacterEncoding(ENCODING_UTF8);
            response.setHeader("Content-Encoding", "gzip");
            GZIPOutputStream out = null;
            //byte[] jsonOut = null;
            String jsonOut = null;
            try {
    //            mapper.setSerializationInclusion(Include.ALWAYS); 
                jsonOut = mapper.writeValueAsString(outJB);
                out = new GZIPOutputStream(response.getOutputStream());   
                out.write(jsonOut.getBytes(ENCODING_UTF8));
                out.flush();   
            } catch (Exception e) {
                logger.error("",e);
            } finally{
                if(out != null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
        }

    1.非gzip接口请求方式

    //RestTemplate POST/PUT请求
        //requestVO请求参数
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Content-Type", "application/json;charset=UTF-8");
        //            requestHeaders.add("User-Agent", "mysite_web");
        requestHeaders.add("connection", "Keep-Alive");
        //            requestHeaders.add("Accept", "application/json;version=3.0;compress=false");
    
        RestTemplate template = new RestTemplate();
        HttpEntity<String> requestEntity = new HttpEntity<>(GsonUtils.toJson(requestVO), requestHeaders);
        logger.info("url=" + serverURL + "/console/test/testRemark/add" );
        ResponseEntity<ResponseData> response = template.exchange(serverURL + "/console/test/testRemark/add",
                HttpMethod.POST, requestEntity, ResponseData.class);
    
        ResponseData httpResult = response.getBody();
        logger.info("httpResult=" + GsonUtils.toJson(httpResult));
    
        
        //RestTemplate GET请求
        //请求参数跟在url后面
        HttpHeaders requestHeaders = new HttpHeaders();
        requestHeaders.add("Content-Type", "application/json;charset=UTF-8");
        //            requestHeaders.add("User-Agent", "mysite_web");
        requestHeaders.add("connection", "Keep-Alive");
        //            requestHeaders.add("Accept", "application/json;version=3.0;compress=false");
    
        RestTemplate template = new RestTemplate();
        HttpEntity<String> requestEntity = new HttpEntity<>(null, requestHeaders);
        logger.info("url=" + serverURL + "/console/test/testRemark/add?参数1=aa&参数2=bb" );
        ResponseEntity<ResponseData> response = template.exchange(serverURL + "/console/test/testRemark/add?参数1=aa&参数2=bb",
                HttpMethod.GET, requestEntity, ResponseData.class);
    
        ResponseData httpResult = response.getBody();
        logger.info("httpResult=" + GsonUtils.toJson(httpResult));

    2.gzip接口请求方式

    import com.fasterxml.jackson.databind.ObjectMapper;
    
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.net.HttpURLConnection;
    import java.net.URL;
    import java.util.zip.GZIPInputStream;
    import java.util.zip.GZIPOutputStream;
    
    /**
     * 请求接口返回gzip的http工具类
     */
    public class HttpUtil {
    
        public class HttpResult {
    
            private String resCode;
            private String resMsg;
            private Object data;
    
            public String getResCode() {
                return resCode;
            }
    
            public void setResCode(String resCode) {
                this.resCode = resCode;
            }
    
            public String getResMsg() {
                return resMsg;
            }
    
            public void setResMsg(String resMsg) {
                this.resMsg = resMsg;
            }
    
            public Object getData() {
                return data;
            }
    
            public void setData(Object data) {
                this.data = data;
            }
        }
    
        private static final String POST = "POST";
        private static final String GET = "GET";
        private static final String DELETE = "DELETE";
        private static final String PUT = "PUT";
    
        private static final String ENCODEING = "UTF-8";
    
        public static HttpResult get(String reqUrl) throws Exception{
            String result = send(reqUrl, "", GET);
            System.out.println("reqUrl="+reqUrl+";result="+result);
    
            ObjectMapper om = new ObjectMapper();
            return om.readValue(result, HttpResult.class);
        }
    
        public static HttpResult post(String reqUrl, String reqContent) throws Exception{
            String result = send(reqUrl, reqContent, POST);
            System.out.println("reqUrl="+reqUrl+";result="+result);
    
            ObjectMapper om = new ObjectMapper();
            return om.readValue(result, HttpResult.class);
        }
    
    
        private static String send(String reqUrl, String reqContent, String method) throws Exception {
            String resContent = null;
    
            HttpURLConnection conn = null;
            GZIPOutputStream out = null;
            GZIPInputStream in = null;
            BufferedReader reader = null;
            try {
                URL url = new URL(reqUrl);
                conn = (HttpURLConnection) url.openConnection();
                conn.setConnectTimeout(100000);
                conn.setReadTimeout(100000);
    
    
                conn.setDoOutput(true);
                conn.setDoInput(true);
                conn.setUseCaches(false);
                conn.setInstanceFollowRedirects(false);//是否自动处理重定向
                conn.setRequestMethod(method);
                conn.setRequestProperty("connection", "Keep-Alive");
                conn.setRequestProperty("Content-Type", "application/json; charset=utf-8");//传递参数使用 &链接的表单提交方式
                conn.setRequestProperty("User-Agent", "mysite_web");
    
                conn.connect();
                //java.util.zip.ZipException: Not in GZIP format
                if (!method.equals(GET)) {
                    out = new GZIPOutputStream(conn.getOutputStream());
                    //发送请求数据
                    out.write(reqContent.getBytes(ENCODEING));
                    out.flush();
                    out.close();
                }
    
                //接收返回数据
                int resCode = conn.getResponseCode();
                if(resCode == 200){
                    in = new GZIPInputStream(conn.getInputStream());
                    reader = new BufferedReader(new InputStreamReader(in, ENCODEING));
                    resContent = reader.readLine();
                }else{
                    System.out.println("服务器返回码:"+resCode);
                }
            } catch (Exception e) {
                throw e;
            } finally{
                if(reader != null){
                    reader.close();
                }
                if(in != null){
                    try {
                        in.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(out != null){
                    try {
                        out.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                if(conn != null){
                    conn.disconnect();
                }
            }
            return resContent;
        }
    }
  • 相关阅读:
    [Elasticsearch] 向已存在的索引中加入自己定义filter/analyzer
    Hibernate持久化对象的状态
    android 利用cmdline,将參数从preloader传递到kernel
    HDOJ的题目分类
    activiti自己定义流程之Spring整合activiti-modeler实例(七):任务列表展示
    十大广泛使用的Linux发行版
    Windows下配置Git服务器和客户端 超全
    适当使用enum做数据字典 ( .net c# winform csharp asp.net webform )
    System.Drawing.Image在Save之后Type变了
    winform ListView应用之分组、重绘图标、网格线 (c# .net winform)
  • 原文地址:https://www.cnblogs.com/oktokeep/p/16769602.html
Copyright © 2020-2023  润新知