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.pswp.cn/bicheng/71686.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/71686.shtml
英文地址,請注明出處:http://en.pswp.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;本文將介…