有时需要将HTTP请求头的值设为中文,但如果直接设成中文,会抛出异常,例如,下面的代码为Chinese请求头设置了中文。
- from urllib import request
- url = 'http://httpbin.org/post'
- headers = {
- 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
- 'Host':'httpbin.org',
- 'Chinese':'李宁',
- }
- req = request.Request(url = url,headers=headers,method="POST")
- request.urlopen(req)
执行这段代码,会抛出如下的异常。
- UnicodeEncodeError: 'latin-1' codec can't encode characters in position 0-1: ordinal not in range(256)
这个异常表明HTTP请求头只能是英文字符和符号,不能是双字节的文字,如中文。为了解决这个问题,在设置HTTP请求头时需要将中文编码,然后发送到服务端后,在服务端用同样的规则解码。可以采用多种编码方式,例如url编码,base64编码,url编码就是在浏览器地址栏中如果输入中文,会将其转换为%xx的形式。如输入“中国”,会变成E4%B8%AD%E5%9B%BD。
对字符串url编码,需要使用urllib.parse模块的urlencode函数,解码要使用unquote函数,代码如下:
- from urllib.parse import unquote,urlencode
- # 对中文进行编码
- value = urlencode({'name':'李宁'})
- print(value)
- # 对中文进行解码
- print(unquote(value))
执行这段代码,会输出如下结果:
- name=%E6%9D%8E%E5%AE%81
- name=李宁
使用urlencode函数进行编码时,需要指定字典类型,不能直接对字符串进行编码。因为urlencode函数只能对url参数进行编码。
base64编码需要使用base64模块中的b64encode函数,解码使用b64decode函数,代码如下:
- import base64
- # 对中文进行编码
- base64Value = base64.b64encode(bytes('Python从菜鸟到高手',encoding='utf-8'))
- print(str(base64Value,'utf-8'))
- # 对中文进行解码,并按utf-8编码格式将解码后的结果转换为字符串
- print(str(base64.b64decode(base64Value),'utf-8'))
b64encode函数编码后返回的是bytes类型,需要使用str函数将其转换为字符串类型。b64decode函数解码时需要指定bytes类型的值,b64decode函数的返回值也是bytes类型,所以也需要str函数将该函数的返回值转换为字符串。
下面的例子演示了设置中文HTTP请求头,并对其解码的完整过程。
- from urllib import request
- from urllib.parse import unquote,urlencode
- import base64
- url = 'http://httpbin.org/post'
- headers = {
- 'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.109 Safari/537.36',
- 'Host':'httpbin.org',
- 'Chinese1':urlencode({'name':'李宁'}), # 设置中文HTTP请求头,用url编码格式
- # 设置中文HTTP请求头,用base64编码格式
- 'MyChinese':base64.b64encode(bytes('这是中文HTTP请求头',encoding='utf-8')),
- 'who':'Python Scrapy'
- }
- dict = {
- 'name':'Bill',
- 'age':30
- }
- data = bytes(urlencode(dict),encoding='utf-8')
- req = request.Request(url = url,data=data,headers=headers,method="POST")
- # 通过add_header方法添加中文HTTP请求头,url编码格式
- req.add_header('Chinese2',urlencode({"国籍":"中国"}))
- response=request.urlopen(req)
- # 获取服务端的响应信息
- value = response.read().decode('utf-8')
- print(value)
- import json
- # 将返回值转换为json对象
- responseObj = json.loads(value)
- # 解码url编码格式的HTTP请求头
- print(unquote(responseObj['headers']['Chinese1']))
- # 解码url编码格式的HTTP请求头
- print(unquote(responseObj['headers']['Chinese2']))
- # 解码base64编码格式的HTTP请求头
- print(str(base64.b64decode(responseObj['headers']['Mychinese']),'utf-8'))
运行结果如图1所示。
图1 设置中文HTTP请求头
本文转载自微信公众号「极客起源」,可以通过以下二维码关注。转载本文请联系极客起源公众号。
??提到慕尼黑,大家第一个想到总是啤酒节,其实慕尼黑的文化同样闻名世界。慕尼...
案例背景 高校健康打卡项目发起于北京大学软件与微电子学院,是该学院张齐勋老师...
客户简介 全民直播是一家涵盖游戏、娱乐、户外等多领域泛娱乐的直播平台。2015年...
云虚拟主机 可以干什么?云 虚拟主机 可以是搭 建网站 的重要产品,可用来存放网...
公司介绍 我们公司是全球法律服务整合平台,已有的4万多名律师遍布全国359个城市...
注册了 域名 不备案可以吗?可以的。 注册域名 并不是一定要备案的,只有搭 建网...
客户简介 趣医网(quyiyuan.com)创立于2014年,为京颐集团重要成员企业之一,是...
3月24日,腾讯发布2020年Q4及全年财报,其中金融科技及企业服务第四季收入385亿...
API风格说明 当前ECS服务对外开放两类风格的API: ECS服务自定义规范的API(以下...
排查思路 无法通过远程桌面连接裸金属服务器时,我们推荐您按照以下思路排查问题...