urlencode与urldecode

今天在通过requests做接口请求的时候,发现不管是用dict还是用json传参,都没有办法请求成功。

然后我又通过jmeter试了一下。发现能请求成功。不是接口的问题。

 然后我看了一下请求参数。是一个UrlEncode编码。我想是不是我用requests请求的时候也需要转换成UrlEncode编码编码呢?

 把我的数据data,转换成UrlEncode编码。发现请求成功。

 那么,什么是UrlEncode编码呢?

定义:百分号编码(英语:Percent-encoding), 也称作URL编码(英语:URL encoding), 是特定上下文的统一资源定位符 (URL)的编码机制. 实际上也适用于统一资源标志符(URI)的编码。也用于 为"application/x-www-form-urlencoded" MIME准备数据, 因为它用于通过HTTP的请求操作(request)提交HTML表单数据。
 
使用urlENcode原因:
1、当字符串数据以url的形式传递给web服务器时,字符串中是不允许出现空格和特殊字符的
2、因为 url 对字符有限制,比如把一个邮箱放入 url,就需要使用 urlencode 函数,因为 url 中不能包含 @ 字符。
 
编码原理:
将需要转码的字符转为16进制,然后从右到左,取4位(不足4位直接处理),每2位做一位,前面加上%,编码成%XY格式。
比如:
空格ASCII码是32,对应16进制是20,那么urlencode编码结果是:%20,但在新标准中空格对应的是+
比如:
中 ASCII码是-10544,对应的16进制是FFFFFFFFFFFFD6D0,那么urlencode编码结果是:%D6%D0
部分特殊字符编码:
空格 ! # $ % + @ : = ?
%20 %21 %23 %24 %25 %2B %40 %3A %3D %3F

一、urlencode

urllib库里面有个urlencode函数,可以把key-value这样的键值对转换成我们想要的格式,返回的是a=1&b=2这样的字符串,比如:

import urllib.parse

data ={
    "sstType":2,
    "sstShiftType":2,
    "shiftsJson":[
        {"ssName":"白班",
         "ssStartTime":"08:00:00",
         "ssEndTime":"17:00:00",
         "ssUnid":363}
    ]
}

# 转换成UrlEncode编码
data=urllib.parse.urlencode(data,encoding='gb2312')

print(data)

结果:
sstType=2&sstShiftType=2&shiftsJson=%5B%7B%27ssName%27%3A+%27%B0%D7%B0%E0%27%2C+%27ssStartTime%27%3A+%2708%3A00%3A00%27%2C+%27ssEndTime%27%3A+%2717%3A00%3A00%27%2C+%27ssUnid%27%3A+363%7D%5D

如果只想对一个字符串进行urlencode转换,怎么办?urllib提供另外一个函数:quote()

import urllib.parse

str='杭州'
str=urllib.parse.quote(str)
print(str)

结果:
%E6%9D%AD%E5%B7%9E

二、urldecode

当urlencode之后的字符串传递过来之后,接受完毕就要解码了——urldecode。urllib提供了unquote()这个函数,可没有urldecode()!

import urllib.parse

surl='%E6%9D%AD%E5%B7%9E'
surl=urllib.parse.unquote(surl)
print(surl)

结果:
杭州

原文地址:https://www.cnblogs.com/renshengruxi/p/14550733.html