URL编码

URL编码是一种浏览器用来打包表单输入的格式; 浏览器从表单中获取所有的name和其中的值, 将它们以name/value参数编码(移去那些不能传送的字符, 将数据排行等等) 作为URL的一部分或者分离地发给服务器


为什么需要urlencode编码

原因:如果一样东西需要编码, 说明其并不适合直接传输。原因多种多样, 如Size过大, 包含隐私数据。对于Url来说, 之所以要进行编码, 是因为Url中有些字符会引起歧义。

例如:URL参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8。如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码


运用场景

在用Python+requests做接口自动化过程中,http协议在发送url的时候,是以urlencode的编码格式传过去的,通常requests

库会帮我们自动处理了。但是某些特殊情况下我们就需要通过其他的方法处理编码与解码的问题。

比如:

    1.  服务端返回的url地址,有时候是以urlencode的编码传过来的,我们需要从url上提取一些参数信息,这时候就需要对url解码

    2.  登录功能中涉及到JavaScript中的回调函数(callback),把需要回调的URL(带参数)传参给后端接口, 这时就需对传参的url编码


Python之urllib.parse

urllib.parse 里面三个方法:urlencode、quote 和 unquote, 分别参数编码与解码

urlencode编码

如果我们想自己操作,对字符串传入的字典参数进行urlencode编码,就需要用到两个方法urlencode和quote

urlencode

urlencode方法能对字典编码,如下:


#!/usr/bin/python3
# coding=utf-8
# Author: sitven

from urllib.parse import urlencode

payload = {
    "content": "中文内容信息",
    "charsetSelect": "utf-8",
    "en": "UrlEncode编码"
}
print(urlencode(payload))

运行结果:


content=%E4%B8%AD%E6%96%87%E5%86%85%E5%AE%B9%E4%BF%A1%E6%81%AF&charsetSelect=utf-8&en=UrlEncode%E7%BC%96%E7%A0%81


quote

quote方法能对字符串编码,如下:


#!/usr/bin/python3
# coding=utf-8
# Author: sitven

from urllib.parse import quote

print(quote("张大款"))
url = "http://www.baidu.com/?a=张大款&b=sitven"
print(quote(url))

运行结果:


%E5%BC%A0%E5%A4%A7%E6%AC%BE
http%3A//www.baidu.com/%3Fa%3D%E5%BC%A0%E5%A4%A7%E6%AC%BE%26b%3Dsitven


urlencode解码

若返回的数据里面有urlencode编码的字符串, 类似于%E4%B5%B7&b=E6%82%A0这种格式, 可通过unquote方法解码

unquote

unquote方法解码,如下:


#!/usr/bin/python3
# coding=utf-8
# Author: sitven

from urllib.parse import  unquote
import requests

url = "http://httpbin.org/get"
payload = {
    "city": "广州",
    "site": "小蛮腰"
}

r = requests.get(url, params=payload)
print(r.url)
print(unquote(r.url))

运行结果:


http://httpbin.org/get?city=%E5%B9%BF%E5%B7%9E&site=%E5%B0%8F%E8%9B%AE%E8%85%B0
http://httpbin.org/get?city=广州&site=小蛮腰