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

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

python 复制代码
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 编码的内容解码为原始格式

python 复制代码
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、调试方便

在记录日志或调试时,可以直接打印出解码后的请求体内容。

相关推荐
lskisme28 分钟前
springboot maven导入本地jar包
开发语言·python·pycharm
开心-开心急了1 小时前
pyside6实现win10自动切换主题
开发语言·python·pyqt·pyside
创业之路&下一个五年1 小时前
按照ip的转换为二进制的方式理解a\b\c类地址的边界
服务器·网络·tcp/ip
陌路201 小时前
Linux29初识网络:核心概念与分层逻辑
网络
mortimer1 小时前
一键实现人声伴奏分离:基于 `uv`, `FFmpeg` 和 `audio-separator` 的高效解决方案
python·ffmpeg·音视频开发
Sunhen_Qiletian2 小时前
Python 类继承详解:深度学习神经网络架构的构建艺术
python·深度学习·神经网络
Acrelhuang2 小时前
覆盖全场景需求:Acrel-1000 变电站综合自动化系统的技术亮点与应用
大数据·网络·人工智能·笔记·物联网
阿猿收手吧!2 小时前
【Linux网络】shutdown()与close()的区别
linux·网络
00后程序员张2 小时前
混淆 iOS 类名与变量名的实战指南,多工具组合把混淆做成工程能力(混淆 iOS 类名变量名/IPA 成品混淆Ipa/Guard CLI 实操)
android·ios·小程序·https·uni-app·iphone·webview
程序员大雄学编程2 小时前
用Python来学微积分34-定积分的基本性质及其应用
开发语言·python·数学·微积分