get请求中文乱码的一次小坑历险记——工作笔记

公司代码以前是前后端整合在一起的,由于要升级技术栈,现在做前后端分离。原本没有问题,前端童鞋拆分完后中文乱码的问题来了,一个导出的接口多个参数用的get请求,其中有个字段 产品名称 前端传中文到后台出现了中文乱码。
why? 询问前端同学改了什么字符集编码没?答:没有啊!
测试同学催的厉害,明天要上线了今晚必须结束测试(工期短,需求长啊)。奈何前端同学又回家了,作为后端的我只能硬着头皮去修改了,于是我尝试将其转码。
做了如下骚操作:

productName = productName == null ? null : new String(productName.getBytes("iso-8859-1"), "utf-8");

手动发布到开发环境验证,通过
提交代码,走流水线(测试环境是不允许开发插手的)发布到测试环境,等待测试同学验证,通过
测试同学高兴,前端同学高兴,我也高兴,问题“完美解决”。

第二天晚上上线,不输入产品名称可以导出。输入产品名称,无数据可导出!!!
扒开生产环境日志,心里很难受,为毛呢,生产环境日志数据级为info,在没有抛异常或错误的情况下,能看到的仅仅只有接口调用短短一两行日志。告诉自己冷静,仔细思考着为什么。这时我心里一咯噔,中文乱码!!!因为产品名称中文乱码,传输到后台执行sql后查询不到任何数据,因此返回:无数据可导出!虽然没有日志,但是凭借着经验,应该就是这个问题了。

但是话又说回来了,WTF!什么鬼啊这是!我明明做了转码了,开发、测试环境都可以,生产环境不行?
确认运维是否打了旧包,确认结果:版本无误,包没问题。这时候我已经把注意力转移到环境的问题上了。想到了我们运行的容器tomcat身上了。问了下运维生产环境tomcat版本号:tomcat 8.5.31,至此问题已经基本找到了。再次确认下开发和测试环境tomcat版本号均为:7.0.77,问题已经完全定位了:

tomcat 8 默认编码格式:utf-8, tomcat 7 默认编码格式:iso-8859-1

恰巧因为文章开头我为了修复开发和测试环境的中文乱码问题做的一次后台转码才导致在生产环境上出现了乱码。OMG,宝宝心里苦,宝宝还想说出来呢。至此后续就是内部沟通、解释等事情了。

再把话题转回来,为什么get请求会出现中文乱码而post请求没事呢?
抱着刨根问底的心态继续探索:我们的项目在web.xml中用了filter:

<filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <async-supported>true</async-supported>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

既然用了filter为毛post请求可以get请求不行呢?搞歧视?
翻看CharacterEncodingFilter源码:


	@Override
	protected void doFilterInternal(
			HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
			throws ServletException, IOException {
		
		if (this.encoding != null && (this.forceEncoding || request.getCharacterEncoding() == null)) {
			request.setCharacterEncoding(this.encoding);
			if (this.forceEncoding) {
				response.setCharacterEncoding(this.encoding);
			}
		}
		filterChain.doFilter(request, response);
	}

看了源码之后doFilterInternal方法仿佛给了我答案,原来过滤器是通过request.setCharacterEncoding(this.encoding);方式来设置编码方式的。这种方式显然post请求提交的数据,是可以通过设置生效的。但是get请求提交的内容在url中,一开始就已经按照编码分析提交内容,因此request.setCharacterEncoding(this.encoding);对其无效。

至此,疑惑已经基本解开完了,忙里偷闲记个笔记。告诫自己,帮助他人!
如文中出现错误或不准确的地方还请各位大佬不吝赐教,毕竟我菜啊(手动滑稽)!!!

在 Python 中,我们可以使用 requests 模块来发送 HTTP 请求,其中包括 GET 和 POST 请求。下面分别介绍一下这两种请求方式的使用方法。 **GET 请求** GET 请求用于从服务器获取资源,可以通过 URL 参数传递数据。使用 requests 模块发送 GET 请求的代码如下: ```python import requests url = "http://www.example.com/path" response = requests.get(url) print(response.status_code) # 输出状态码 print(response.text) # 输出响应内容 ``` 其中,url 是请求的地址,response 是响应对象。我们可以通过 response.status_code 获取响应的状态码,通过 response.text 获取响应内容。 如果需要传递参数,可以将参数添加到 URL 后面,例如: ```python import requests url = "http://www.example.com/path?param1=value1&param2=value2" response = requests.get(url) print(response.status_code) # 输出状态码 print(response.text) # 输出响应内容 ``` 也可以使用 params 参数传递参数,例如: ```python import requests url = "http://www.example.com/path" params = {"param1": "value1", "param2": "value2"} response = requests.get(url, params=params) print(response.status_code) # 输出状态码 print(response.text) # 输出响应内容 ``` **POST 请求** POST 请求用于向服务器提交数据,数据通常包含在请求体中。使用 requests 模块发送 POST 请求的代码如下: ```python import requests url = "http://www.example.com/path" data = {"key1": "value1", "key2": "value2"} response = requests.post(url, data=data) print(response.status_code) # 输出状态码 print(response.text) # 输出响应内容 ``` 其中,url 是请求的地址,data 是要提交的数据,response 是响应对象。我们可以通过 response.status_code 获取响应的状态码,通过 response.text 获取响应内容。 如果需要传递 JSON 数据,可以使用 json 参数,例如: ```python import requests url = "http://www.example.com/path" data = {"key1": "value1", "key2": "value2"} response = requests.post(url, json=data) print(response.status_code) # 输出状态码 print(response.text) # 输出响应内容 ``` 如果需要上传文件,可以使用 files 参数,例如: ```python import requests url = "http://www.example.com/path" files = {"file": open("path/to/file", "rb")} response = requests.post(url, files=files) print(response.status_code) # 输出状态码 print(response.text) # 输出响应内容 ``` 以上就是 Python 中使用 requests 模块发送 GET 和 POST 请求的基本方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值