当前位置: 首页 > article >正文

如何还原 HTTP 请求日志中的 URL 编码参数?详解 %40 到 @

在记录HTTP请求的日志中出现了这样的情况:

2024-11-20 11:12:49 INFO network_request gz_login 96  Body: countryAbbr=CN&countryCode=86&email=1222405567%40qq.com&password=12354e50456db124f9f34e2789308733&type=1

出现这种情况的原因是:%40 是 URL 编码后的 @ 符号,说明请求体中的参数被编码后记录下来了。这是因为在 HTTP 请求中,某些特殊字符(如 @, &, =)会被 URL 编码以确保安全性。但是看着不直观,如果有其他特殊符号可能就不知道是什么意思了。

解决这个问题可以使用Python 的 urllib.parse.unquote 函数,将 URL 编码的内容解码为原始格式

import logging
from urllib.parse import unquote

logger = logging.getLogger(__name__)

def gz_login(pm):
    # 发送请求
    rsp = requests.post(url, headers=HEADERS, data=data, timeout=(10, 10), verify=False)
    rsp.raise_for_status()

    # 日志记录前对请求体解码
    decoded_body = unquote(rsp.request.body.decode('utf-8') if isinstance(rsp.request.body, bytes) else rsp.request.body)

    logger.info("==== HTTP Request ====")
    logger.info(f"Body (decoded): {decoded_body}")

rsp.request.body
rsp 是 requests 模块的响应对象。
rsp.request 表示与该响应关联的请求对象。
rsp.request.body 是请求体的内容,可能是二进制字节(bytes)格式或字符串(str)格式。


if isinstance(rsp.request.body, bytes)
检查 rsp.request.body 是否为字节类型。
如果是字节类型,则需要先解码为字符串。


rsp.request.body.decode('utf-8')
对字节类型的 body 使用 UTF-8 编码进行解码,得到一个字符串。


else rsp.request.body
如果 body 已经是字符串类型,直接使用它。


unquote(...)
对字符串中的 URL 编码字符进行解码。
例如,%40 会被解码为 @,%20 会被解码为空格。

即,如果 rsp.request.body 是字节类型,先解码为字符串;如果是字符串,直接使用。
然后对该字符串进行 URL 解码,得到原始的请求体内容。
 

这样做的好处是:
1、提高可读性
    URL 编码后数据包含 %XX 格式的转义字符,解码后更直观易读。
2、调试方便
    在记录日志或调试时,可以直接打印出解码后的请求体内容。


http://www.kler.cn/a/411730.html

相关文章:

  • IntelliJ+SpringBoot项目实战(十四)--在SpringBoot中整合SpringSecurity和JWT(上)
  • git(Linux)
  • QML TableView 实例演示 + 可能遇到的一些问题(Qt_6_5_3)
  • Linux进程与资源管理
  • 银河麒麟桌面系统——桌面鼠标变成x,窗口无关闭按钮的解决办法
  • java学习记录12
  • 全渠道供应链变革下“小程序 AI 智能名片 S2B2C 商城系统”的赋能与突破
  • Jmeter中的测试片段和非测试原件
  • 网络安全加解密原理
  • Springboot项目搭建(5)-前端注册界面
  • 十九:HTTP包体的传输方式(2):不定长包体
  • Vue 中父子组件间的参数传递与方法调用
  • sed awk 第二版学习(十一)—— 交互式拼写检查器 spellcheck.awk
  • uni-app 发布媒介功能(自由选择媒介类型的内容) 设计
  • Testbench仿真脚本编写指北
  • 机器学习周报(11.18-11.24)
  • C++:final 关键字用于阻止类被继承或阻止虚函数被进一步重写
  • Node.js笔记(三)局域网聊天室构建1
  • 在 Taro 中实现系统主题适配:亮/暗模式
  • 自动驾驶系统研发系列—智能驾驶倒车盲区终结者:智能侧向警告与制动技术解析
  • MATLAB支持的距离度量
  • 【大数据技术基础】 课程 第8章 数据仓库Hive的安装和使用 大数据基础编程、实验和案例教程(第2版)
  • uniapp定义new plus.nativeObj.View实现APP端全局弹窗
  • MDETR - Modulated Detection for End-to-End Multi-Modal Understanding
  • STM32的AFIO讲解
  • Java 爬虫深度解析销量和商品详情数据获取