前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Illegal character ((CTRL-CHAR, code 31))问题排查 gzip接口返回 RestTemplate GET POST请求

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

作者头像
oktokeep
发布于 2024-10-09 02:03:52
发布于 2024-10-09 02:03:52
16400
代码可运行
举报
文章被收录于专栏:第三方工具第三方工具
运行总次数:0
代码可运行

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#接口返回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接口请求方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//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接口请求方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
RestTemplate exchange GET POST请求传参数DEMO
link: Illegal character ((CTRL-CHAR, code 31))问题排查 gzip接口返回 RestTemplate GET POST请求 https://www.cnblogs.com/oktokeep/p/16769602.html
oktokeep
2024/11/28
1450
Gzip压缩文件和压缩字符串,web接口应用
打印输出: testPost发送内容:{"id":"10","name":"zhangliao"} 接口调用返回结果:"json串返回成功"
oktokeep
2024/11/21
1270
Java映射 转换post response T data
接上篇 Java泛型对象在http请求和响应对象中的封装 https://www.cnblogs.com/oktokeep/p/17688322.html
oktokeep
2024/10/09
1100
RestTemplate用法
RestTemplate 是从 Spring3.0 开始支持的一个 HTTP 请求工具,它提供了常见的REST请求方案的模版,例如 GET 请求、POST 请求、PUT 请求、DELETE 请求以及一些通用的请求执行方法 exchange 以及 execute。RestTemplate 继承自 InterceptingHttpAccessor 并且实现了 RestOperations 接口,其中 RestOperations 接口定义了基本的 RESTful 操作,这些操作在 RestTemplate 中都
鱼找水需要时间
2023/02/16
4420
http请求方式-RestTemplate
oktokeep
2024/10/09
1240
RestTemplate.exchange各种用法(包括泛型等 --全)
在我们日常开发中,无论是内部服务之间的调用,还是调用第三方服务,都免不了发起Http请求,在Java中发起Http请求常见的方式大致有原生HttpURLConnection、Apache的HttpClient、Spring的RestTemplate等,如果您基于Spring框架,那么强烈推荐使用RestTemplate,理由很简单:非常符合我们发起http请求的习惯,就像使用postman,只需要关心具体的url、header、body等即可,对于繁琐的细节RestTemplate都帮我们安排(封装)的明明白白,无关的细节我们统统不用操心! 尤其是RestTemplate.exchange方法,可以称的上是单靠一招就可以吊打其它方式。。。 所以本文就来详细介绍一下RestTemplate.exchange各种用法,力求覆盖日常开发中的各种场景,Let’s start~~
天罡gg
2022/12/02
6.7K1
RestTemplate.exchange各种用法(包括泛型等 --全)
Springboot 整合 RestTemplate 调用第三方接口
导入依赖 springboot 已经加入了该依赖 import org.springframework.web.client.RestTemplate; 创建工具类 @Component @Slf4j public class RestTemplateUtil { @Resource private RestTemplate restTemplate; /** * 配置请求超时时间 */ public final HttpComponentsC
用户10125653
2022/11/10
1.2K0
总结:使用 RestTemplate 发送HTTP请求
一般发送HTTP请求是使用 Apache的HttpClient,它比较灵活。在 spring cloud 中往往提供的 REST 风格的服务。RestTemplate 提供了一种简单便捷的模板类来进行HTTP操作的方式。
张云飞Vir
2021/05/18
3.1K0
ElasticSearch全文搜索引擎 -Spring Boot操作ES(SpringData概述、Spring Data Elasticsearch、基本操作、ElasticSearch操作文档)
Spring Data是spring提供的一套连接各种第三方数据源的框架集,它支持连接很多第三方数据源,例如:
鱼找水需要时间
2023/02/16
2.6K0
ElasticSearch全文搜索引擎 -Spring Boot操作ES(SpringData概述、Spring Data Elasticsearch、基本操作、ElasticSearch操作文档)
Restful 介绍及SpringMVC+restful 实例讲解
restful不是一个框架,称为一种编码更烦更贴切吧,其核心类位于spring-web.jar中,即RestTemplate.class
肖哥哥
2019/02/22
5110
Restful 介绍及SpringMVC+restful 实例讲解
Springboot — 用更优雅的方式发HTTP请求(RestTemplate详解)
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
Java_老男孩
2019/12/02
11.6K1
异步回调方法 调用返回Cannot render error page for request [xxxxx] as the response has already been commited. A
异步回调方法 调用返回Cannot render error page for request [xxxxx] as the response has already been commited. As a result, 解决方案
oktokeep
2025/03/25
1790
RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
YourBatman
2019/09/18
2.3K0
RestTemplate的使用和原理你都烂熟于胸了吗?【享学Spring MVC】
聊聊RestTemplate对HttpClient的适配
org/springframework/http/client/ClientHttpRequestFactory.java
code4it
2023/10/08
3160
给RestTemplate添加拦截器记录请求响应
RestTemplate是Spring提供的用于访问Rest服务的客户端,RestTemplate提供了多种便捷访问远程Http服务的方法,能够大大提高客户端的编写效率。
JQ实验室
2022/09/02
1.5K0
聊聊RestTemplate对HttpClient的适配
org/springframework/http/client/ClientHttpRequestFactory.java
code4it
2023/10/09
4670
聊聊RestTemplate对HttpClient的适配
springboot实战之常用http客户端整合
本文主要介绍一下三种http客户端,httpcomponents项目下的httpclient(后边简化描述为httpcomponents-client)、restTemplate、webclient的基本用法
lyb-geek
2019/11/12
8.1K0
springboot实战之常用http客户端整合
SpringBoot系列之RestTemplate调https接口
业务:本系统接口都是http的,调用第三方接口,因为做了安全性校验,所以不能通过RestTemplate调用
烂猪皮
2020/12/15
2.4K0
Spring Boot(三):RestTemplate提交表单数据的三种方法
在REST接口的设计中,利用RestTemplate进行接口测试是种常见的方法,但在使用过程中,由于其方法参数众多,很多同学又混淆了表单提交与Payload提交方式的差别,而且接口设计与传统的浏览器使用的提交方式又有差异,经常出现各种各样的错误,如405错误,或者根本就得不到提交的数据,错误样例如下:
业余草
2019/01/21
2.4K0
万字长文讲解调用第三方接口,RestTemplate,urlConnection使用详解,java代码模拟postman发送请求
在日常开发中,经常需要调用第三方接口,例如调用物流接口,此时需要利用urlConnection或者restTemplate模拟postman发送请求,请求支持加header ,设置content-type支持传递json;请求方式get,post,也可以需要传递文件,或者传递文件流;
javaNice
2023/11/20
9740
推荐阅读
相关推荐
RestTemplate exchange GET POST请求传参数DEMO
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档