python~http的请求参数中携带map

背景

调试 http GET请求的 map 参数,链路携带参数一直有问题,最终采用如下方式携带map 解决

user={"demo":"true","info":"王者"}

url encode之后的效果如下所示

user=%7B%22demo%22:%22true%22,%22info%22:%22%E7%8E%8B%E8%80%85%22%7D

最终http的url如下:

http://www.demo.com?user=%7B%22demo%22:%22true%22,%22info%22:%22%E7%8E%8B%E8%80%85%22%7D

代码

方式一

tmp = {"demo":"true","info":"王者"}
json_str = json.dumps(tmp)
encoded_str = urllib.parse.quote(json_str)
url += '&user=%s' % encoded_str

方式二

tmp = {"demo":"true","info":"王者"}
params['user'] = json.dumps(tmp)
r = requests.get(url, headers=headers, params=params, timeout=2)

urllib.parse.quote

URL 中,某些字符具有特殊含义
例如 / 用于分隔 URL 的不同部分,? 用于标识查询字符串的起始,& 用于分隔查询字符串中的不同参数等

当需要在 URL 里包含可能与这些特殊字符冲突的字符(像空格、中文、?&=等特殊符号等)时,就必须对这些字符进行 url 编码,以保证 URL 的正确性和完整性
urllib.parse.quote 函数的作用就是把字符串里的特殊字符转换为符合 URL 规范的编码形式

urllib.parse.quote 函数采用的是百分号编码(Percent-encoding)规则,也称作 URL 编码。在此编码规则下,每个特殊字符会被替换成 % 后面跟着两个十六进制数字,这两个数字代表该字符的 ASCII 码值。比如,空格会被编码为 %20,中文等非 ASCII 字符会先转化为 UTF-8 字节序列,然后每个字节再进行百分号编码

urllib.parse.quote(string, safe='/', encoding=None, errors=None)

string:
这是必需参数,指的是需要进行 URL 编码的字符串

safe:
可选,指定哪些字符不需要进行编码,默认值为 /,意味着 / 字符不会被编码
可以根据实际需求修改这个参数,例如 safe=‘’ 表示对所有字符都进行编码

encoding:
可选,指定字符串的编码方式,默认使用 UTF - 8 编码

errors:
可选,指定编码错误的处理方式,默认值为 ‘strict’,表示遇到编码错误时会抛出异常

示例

import urllib.parse# 包含特殊字符和中文的字符串
string_to_encode = "你好, world! & / ? ="# 进行 URL 编码
encoded_string = urllib.parse.quote(string_to_encode)print(encoded_string)

效果

%E4%BD%A0%E5%A5%BD%2C%20world%21%20%26%20/%20%3F%20%3D

编码学习

百分号编码(Percent-encoding)也称为 URL 编码,它将非 ASCII 字符先转换为 UTF-8 字节序列,然后每个字节再用 % 加上对应的两位十六进制数来表示。

如何将汉字 “我” 转换为 %E6%88%91
字符编码为 UTF-8 字节序列:在 UTF-8 编码中,不同的字符会被编码为不同长度的字节序列。像汉字通常会被编码为 3 个字节。“我” 这个字在 UTF-8 编码下对应的字节序列是 0xE6 0x88 0x91
转换为百分号编码形式:把每个字节转换为 % 加上对应的两位十六进制数。
例如,字节 0xE6 转换为 %E6,字节 0x88 转换为 %88,字节 0x91 转换为 %91。最终 “我” 就被编码为 %E6%88%91

cat demo.py 
# coding: utf-8# 定义要编码的字符
char = "我"# 对字符进行 UTF-8 编码,得到字节序列
utf8_bytes = char.encode('utf-8')# 将字节序列转换为百分号编码形式
percent_encoded = ''.join(f'%{byte:02X}' for byte in utf8_bytes)# %E6%88%91
print(percent_encoded)

url编码时,为什么有些编码是把空格编码为+,有些则编码为%20

主要取决于使用的编码规范和具体场景

历史背景与规范差异

+ 编码(application/x-www-form-urlencoded)

表单提交规范:在 HTML 表单使用 POST 方法提交数据时,如果表单的 enctype 属性设置为 application/x-www-form-urlencoded(这是表单提交的默认编码类型),空格会被编码为 +。这个规范源自早期的互联网实践,是为了在传输数据时能够更紧凑地表示空格,因为 +%20 占用的字符更少

相关标准:这种编码方式在 HTML 表单数据处理和一些老的 CGI(Common Gateway Interface)程序中广泛使用。例如,当在一个 HTML 表单中输入包含空格的内容并提交时,服务器端接收到的数据里空格就会以 + 的形式呈现。

%20 编码(通用 URL 编码)

RFC 3986 标准:根据互联网工程任务组(IETF)发布的 RFC 3986 标准,在通用的 URL 编码中,空格应该被编码为 %20。这个标准定义了统一的 URI(Uniform Resource Identifier)语法和编码规则,适用于各种类型的 URL,包括路径、查询参数等。
通用性和兼容性:%20 编码更具通用性和兼容性,因为它遵循了标准的百分号编码规则,可以确保在不同的系统和应用程序中正确解析。在大多数现代的 HTTP 请求库和工具中,默认使用 %20 来编码空格。

不同编程语言和库的处理方式

使用 + 编码的情况

Python 的 urllib.urlencode(Python 2):
在 Python 2 的 urllib 模块中,urlencode 函数默认将空格编码为 +,这是为了与 application/x-www-form-urlencoded 规范保持一致

# coding: utf-8import urllibparams = {'key': 'hello world'}
encoded_params = urllib.urlencode(params)# 输出: key=hello+world
print encoded_params

使用 %20 编码的情况

Python 的 urllib.parse.quote(Python 3):
在 Python 3 的 urllib.parse 模块中,quote 函数遵循 RFC 3986 标准,将空格编码为 %20

# coding: utf-8import urllib.parsestring = 'hello world'
encoded_string = urllib.parse.quote(string)# 输出: hello%20world
print(encoded_string)

requests处理时的 params 默认做法

# coding: utf-8import requestsparams = {'key': 'hello world'}
resp = requests.get('http://example.com', params=params)# http://example.com/?key=hello+world
print(resp.url)
# <Response [200]>
print(resp)

示例

# coding: utf-8import json
import requestsuser= {"demo": "true","info": "王者"
}
# {'user': '{"demo": "true", "info": "\\u738b\\u8005"}'} map以这种方式json化有空格
user_str = json.dumps(user)
params = {'user': user_str}
response = requests.get('http://example.com', params=params)# http://example.com/?user=%7B%22demo%22%3A+%22true%22%2C+%22info%22%3A+%22%5Cu738b%5Cu8005%22%7D
print(response.url)
# <Response [200]>
print(response)

手动挨个编码

# coding: utf-8import requests
import urllib.parse# 定义参数
original_params = {'key': 'hello world'
}# 手动编码参数值
encoded_params = {key: urllib.parse.quote(value) for key, value in original_params.items()}url = 'http://httpbin.org/get'
response = requests.get(url, params=encoded_params)# http://httpbin.org/get?key=hello%2520world
print(response.url)

编码过度了,编码了两遍

使用%20

# coding: utf-8
import requests
import urllib.parse# 定义参数
original_params = {'key': 'hello world'
}# 手动编码参数值并构建参数字符串
param_list = []
for key, value in original_params.items():encoded_value = urllib.parse.quote(value)param_list.append(f"{key}={encoded_value}")
param_string = '&'.join(param_list)base_url = 'http://httpbin.org/get'
full_url = f"{base_url}?{param_string}"# http://httpbin.org/get?key=hello%20world
response = requests.get(full_url)
print(response.url)

总结

空格编码为 + 主要用于 HTML 表单提交和一些遵循 application/x-www-form-urlencoded 规范的场景
空格编码为 %20 遵循 RFC 3986 标准,适用于通用的 URL 编码,具有更好的通用性和兼容性

在实际应用中,需要根据具体的需求和场景选择合适的编码方式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/71686.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(java/Spring boot)使用火山引擎官方推荐方法向大模型发送请求

首先在maven里面引入官方依赖 <dependency><groupId>com.volcengine</groupId><artifactId>volcengine-java-sdk-ark-runtime</artifactId><version>LATEST</version></dependency>然后我们编写测试类 package com.volcengin…

Scrum方法论指导下的Deepseek R1医疗AI部署开发

一、引言 1.1 研究背景与意义 在当今数智化时代&#xff0c;软件开发方法论对于项目的成功实施起着举足轻重的作用。Scrum 作为一种广泛应用的敏捷开发方法论&#xff0c;以其迭代式开发、快速反馈和高效协作的特点&#xff0c;在软件开发领域占据了重要地位。自 20 世纪 90 …

LeetCode 热题 100_搜索插入位置(63_35_简单_C++)(二分查找)(”>>“ 与 “/” 对比)

LeetCode 热题 100_搜索插入位置&#xff08;63_35&#xff09; 题目描述&#xff1a;输入输出样例&#xff1a;题解&#xff1a;解题思路&#xff1a;思路一&#xff08;二分查找&#xff09;&#xff1a; 代码实现代码实现&#xff08;思路一&#xff08;二分查找&#xff09…

蓝桥与力扣刷题(蓝桥 交换瓶子)

题目&#xff1a;有 N 个瓶子&#xff0c;编号 1 ~ N&#xff0c;放在架子上。 比如有 5 个瓶子&#xff1a; 2 1 3 5 4 要求每次拿起 2 个瓶子&#xff0c;交换它们的位置。 经过若干次后&#xff0c;使得瓶子的序号为&#xff1a; 1 2 3 4 5 对于这么简单的情况&#x…

HTTPS 通信流程

HTTPS 通信流程时序图&#xff1a; #mermaid-svg-HWoTbFvfih6aYUu6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-icon{fill:#552222;}#mermaid-svg-HWoTbFvfih6aYUu6 .error-text{fill:#…

Spring AutoWired与Resource区别?

大家好&#xff0c;我是锋哥。今天分享关于【Spring AutoWired与Resource区别?】面试题。希望对大家有帮助&#xff1b; Spring AutoWired与Resource区别? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 在 Spring 中&#xff0c;Autowired 和 Resource 都是用于…

什么是HTTP/2协议?NGINX如何支持HTTP/2并提升网站性能?

HTTP/2是一种用于在Web浏览器和服务器之间进行通信的协议&#xff0c;旨在提高网站性能和加载速度。它是HTTP/1.1的继任者&#xff0c;引入了许多优化和改进&#xff0c;以适应现代Web应用的需求。HTTP/2的主要目标是减少延迟、提高效率&#xff0c;以及更好地支持并发请求。 …

【Bluedroid】AVRCP 连接源码分析(一)

一、AVRCP协议简介 AVRCP(Audio/Video Remote Control Profile)是蓝牙协议栈中的一个重要部分,它定义了蓝牙设备之间的音视频传输控制的流程和特点。AVRCP使得用户可以通过一个蓝牙设备(如手机)远程控制另一个蓝牙设备(如蓝牙耳机或音箱)上的音视频播放,如播放、暂停、…

【QT中的一些高级数据结构,持续更新中...】

QT中有一些很精妙、便捷的设计&#xff0c;在了解这些数据的同时&#xff0c;我们可以学到如何更好的设计代码。本贴持续更新中&#xff0c;欢迎关注和收藏 一 QScopedPointer主要特点&#xff1a;示例代码 二 Q_DISABLE_COPY 一 QScopedPointer QScopedPointer 是 Qt 中的一种…

行业分析---对自动驾驶规控算法的思考

1 前言 随着自动驾驶端到端大模型的兴起&#xff0c;小鹏、华为、理想、蔚来、小米等公司都对自动驾驶业务部进行了组织架构的调整&#xff0c;准备应对新的或者更高级别的自动驾驶研发任务。 近几年由于自动驾驶技术的快速发展&#xff0c;不少从业者觉得相关职业的未来充满了…

C++ 设计模式-模板方法模式

文件处理 #include <iostream>// 抽象基类&#xff1a;定义模板方法和抽象步骤 class DataProcessor { public:// 模板方法&#xff08;固定流程&#xff09;void Process() {OpenFile();ProcessData(); // 由子类实现CloseFile();}protected:virtual void ProcessData…

Deepseek快速做PPT

背景: DeepSeek大纲生成 → Kimi结构化排版 → 数据审查,细节调整 DeepSeek 拥有深度思考能力,擅长逻辑构建与内容生成,它会根据我们的问题进行思考,其深度思考能力当前测试下来,不愧为国内No.1,而且还会把中间的思考过程展示出来,大多时候会给出很多我们意想不到的思…

【多语言生态篇一】【DeepSeek×Java:Spring Boot微服务集成全栈指南 】

(手把手带你从零实现AI能力调用,万字长文预警,建议收藏实操) 一、环境准备:别输在起跑线上 1.1 硬件软件全家桶 JDK版本:必须 ≥17(Spring Boot 3.2+强制要求,低版本直接报错)IDE推荐:IntelliJ IDEA终极版(社区版缺Spring AI插件支持)构建工具:Maven 3.9+ / Grad…

【YOLOv8】损失函数

学习视频&#xff1a; yolov8 | 损失函数 之 5、类别损失_哔哩哔哩_bilibili yolov8 | 损失函数 之 6、定位损失 CIoU DFL_哔哩哔哩_bilibili 2.13、yolov8损失函数_哔哩哔哩_bilibili YOLOv8 的损失函数由类别损失和定位损失构成 类别损失&#xff1a;BCE Loss 定位损失…

DEMF模型赋能多模态图像融合,助力肺癌高效分类

目录 论文创新点 实验设计 1. 可视化的研究设计 2. 样本选取和数据处理 3. 集成分类模型 4. 实验结果 5. 可视化结果 图表总结 可视化知识图谱 在肺癌早期筛查中,计算机断层扫描(CT)和正电子发射断层扫描(PET)作为两种关键的影像学手段,分别提供了丰富的解剖结构…

小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试等,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。

小鱼深度评测 通义灵码2.0 1、引言2、通义灵码 更新与安装2.1 IDE插件更新2.1.1 PyCharm 更新2.1.2 VSCode 更新 2.2 官网下载更新 3、 使用体验3.1生成单元测试3. 2 跨语言编程3.3灵码2.0 与1.0 对比 4、总结 1、引言 通义灵码&#xff0c; 我一直使用的编码协助工具&#xf…

《微软量子芯片:开启量子计算新纪元》:此文为AI自动生成

量子计算的神秘面纱 在科技飞速发展的今天,量子计算作为前沿领域,正逐渐走进大众的视野。它宛如一把神秘的钥匙,有望开启未来科技变革的大门,而微软量子芯片则是这把钥匙上一颗璀璨的明珠。 量子计算,简单来说,是一种遵循量子力学规律调控量子信息单元进行计算的新型计算…

深度解读DeepSeek:从原理到模型

一、大模型模型发展路线退 二、DeepSeek V2-V3/R1技术原理 DeepSeek V2、V3 和 R1 模型架构优化要点&#xff1a; 1、‌DeepSeek V2‌ 混合专家架构&#xff08;DeepSeekMoE&#xff09;‌&#xff1a;采用细粒度专家划分与共享专家机制&#xff0c;总参数规模达236B但仅激活…

easyexcel 2.2.6版本导出excel模板时,标题带下拉框及其下拉值过多不显示问题

需求背景&#xff1a;有一个需求要做下拉框的值有100多条&#xff0c;同时这个excel是一个多sheet的导入模板 直接用easyexcel 导出&#xff0c;会出现下拉框的值过多&#xff0c;导致生成出来的excel模板无法正常展示下拉功能 使用的easyexcel版本&#xff1a;<depende…

基于WebRTC与AI大模型接入EasyRTC:打造轻量级、高实时、强互动的嵌入式音视频解决方案

随着物联网和嵌入式技术的快速发展&#xff0c;嵌入式设备对实时音视频通信的需求日益增长。然而&#xff0c;传统的音视频解决方案往往存在体积庞大、实时性差、互动体验不佳等问题&#xff0c;难以满足嵌入式设备的资源限制和应用场景需求。 针对以上痛点&#xff0c;本文将介…