zoukankan      html  css  js  c++  java
  • python接口自动化27-urlencode编码%E6%82%A0%E6%82%A0与解码

    前言

    urllib.parse 里面三个方法:urlencode,quote,unquote详解。

    在做接口自动化过程中,http协议在发送url的时候,是以urlencode的编码格式传过去的,通常requests库会帮我们自动处理了。但是服务端返回的url地址,有时候是以urlencode的编码传过来的,我们需要从url上提取一些参数信息,这时候就需要对url解码了。

    为什么需要urlencode编码

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

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

    urlencode编码

    先看一个python请求案例

    import requests
    
    url = "http://www.example.com/"
    par = {
        "a": "上海",
        "b": "悠悠"
    }
    body = {
        "content": "悠悠",
        "charsetSelect": "utf-8",
        "en": "UrlEncode编码"
    }
    
    r = requests.post(url, params=par, data=body)
    print(r.url)
    

    运行结果:

    http://www.example.com/?a=上海&b=悠悠

    通过fiddler抓包看raw,会发现传过去的request部分,是经过了urlencode编码的(编码的操作requests库已经帮我们自动处理了,这就是requests人性化的地方)

    urlencode编码

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

    from urllib.parse import urlencode, quote, unquote
    
    # urlencode方法参数是字典
    
    body = {
        "content": "悠悠",
        "charsetSelect": "utf-8",
        "en": "UrlEncode编码"
    }
    print(urlencode(body))
    
    

    运行结果:

    content=%E6%82%A0%E6%82%A0&charsetSelect=utf-8&en=UrlEncode%E7%BC%96%E7%A0%81

    quote传字符串参数

    # quote方法参数是字符串
    
    print(quote("上海-悠悠"))
    
    url = "http://www.example.com/?a=上海&b=悠悠"
    print(quote(url))
    

    运行结果:

    %E4%B8%8A%E6%B5%B7-%E6%82%A0%E6%82%A0
    http%3A//www.example.com/%3Fa%3D%E4%B8%8A%E6%B5%B7%26b%3D%E6%82%A0%E6%82%A0

    urlencode解码

    如果返回的数据里面有urlencode编码的字符串,类似于%E4%B8%8A%E6%B5%B7&b=%E6%82%A0%E6%82%A0这种格式,可以使用unquote方法解码

    import requests
    from urllib.parse import urlencode, quote, unquote
    
    url = "http://www.example.com/"
    par = {
        "a": "上海",
        "b": "悠悠"
    }
    body = {
        "content": "悠悠",
        "charsetSelect": "utf-8",
        "en": "UrlEncode编码"
    }
    
    r = requests.post(url, params=par, data=body)
    print(r.url)
    print(unquote(r.url))
    

    运行结果:

    http://www.example.com/?a=上海&b=悠悠
    http://www.example.com/?a=上海&b=悠悠

  • 相关阅读:
    asp.net web生命周期
    图的数据结构1
    最长公共子串
    内部排序

    棋盘覆盖问题
    队列
    矩阵连乘问题
    图的数据结构2
    旅行售货员问题
  • 原文地址:https://www.cnblogs.com/yoyoketang/p/9878511.html
Copyright © 2011-2022 走看看