簡體   English   中英

使用python請求發送帶有unicode數據的http post請求

[英]Send http post request with unicoded data using python requests

我想向 REST api 發送一個 post 請求,但是我所有的字符都是 unicode 編碼的,例如我想作為\t\e\s\t發送的字符串test 無論我嘗試什么,字符串最終都是\\\t\\\e\\\s\\\t 我可以很容易地修改例如 Burp 中的請求,並刪除雙反斜杠,使其工作。

所以發送到網絡服務器的原始字節是\\x5c\\x5c\\x75\\x30\\x30\\x37\\x34\\x5c\\x5c\\x75\\x30\\x30\\x36\\x35\\x5c\\x5c\\x75\\x30\\x30\\x37\\x33\\x5c\\x5c\\x75\\x30\\x30\\x37\\x34

而我想要的是: \\x5c\\x75\\x30\\x30\\x37\\x34\\x5c\\x75\\x30\\x30\\x36\\x35\\x5c\\x75\\x30\\x30\\x37\\x33\\x5c\\x75\\x30\\x30\\x37\\x34

我嘗試過的一件事是:

import requests

s = 'test'
data = ''
for c in s:
    data +=  "\\u00"+hex(ord(c))[2:].lower()
print(data)
json =  {"user":data}
res = requests.post('http://127.0.0.1/api/getusers', json=json)
print(res.text)

即使我設置data = '\\x5c\\x75\\x30\\x30\\x37\\x34\\x5c\\x75\\x30\\x30\\x36\\x35\\x5c\\x75\\x30\\x30\\x37\\x33\\x5c\\x75\\x30\\x30\\x37\\x34'仍然發送雙反斜杠( \\x5x\\x5c

這對我來說可以。 使用https://httpbin.davecheney.com/post 3.7 和 Requests 2.23.0 進行測試:

import requests, json

url = r"https://httpbin.davecheney.com/post"

data_raw_str = r"\u0074\u0065\u0073\u0074"

s = 'test'
data = ''
for c in s:
    data += '\\u00' + hex(ord(c))[2:].lower()
    #data += fr"\u{ord(c):04x}" # this works, too

json_dict = {'user': data}
r = requests.post(url, json=json_dict)
print(r)

data_returned = json.loads(r.json()['data'])['user']

print(data_raw_str)
print(data)
print(data_returned)
print(data_raw_str == data == data_returned)
print(requests.__version__)

輸出:

<Response [200]>
\u0074\u0065\u0073\u0074
\u0074\u0065\u0073\u0074
\u0074\u0065\u0073\u0074
True
2.23.0

編輯:

根據RFC 8259 - JavaScript 對象表示法 (JSON) 數據交換格式- 7. 字符串:

所有 Unicode 字符都可以放在引號內,但必須轉義的字符除外:引號、反斜杠和控制字符(U+0000 到 U+001F)。

所以反斜杠總是會被 JSON 中的另一個反斜杠轉義。

我相信手動刪除額外的反斜杠會導致服務器的 JSON 解碼器對 unicode 文字進行轉義,因此您的字符串將變成普通的舊test

為什么請求必須是 JSON?

如果您提出此請求,則不會添加額外的反斜杠:

requests.post(url, data=data) # data is a str

如果你提出這個請求,鍵和值是utf-8編碼的,然后是 url 編碼的(單個反斜杠被替換為%5C ):

requests.post(url, data=json_dict)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM