Python 3.x Python3请求和头顺序

Python 3.x Python3请求和头顺序,python-3.x,python-requests,http-headers,Python 3.x,Python Requests,Http Headers,我想做一个标题的要求,在完全相同的顺序,我写下来。 但有了Burp,我发现无论我如何用代码编写它,它似乎都会以另一种方式自行排序标题 这是我的标题顺序: 标题={ '主机':'本地主机', “用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:80.0)Gecko/20100101 Firefox/80.0”, “Accept':“application/json,text/plain,*/*”, “接受语言”:“de de”, “接受编码”:“gzi

我想做一个标题的要求,在完全相同的顺序,我写下来。 但有了Burp,我发现无论我如何用代码编写它,它似乎都会以另一种方式自行排序标题

这是我的标题顺序:

标题={
'主机':'本地主机',
“用户代理”:“Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:80.0)Gecko/20100101 Firefox/80.0”,
“Accept':“application/json,text/plain,*/*”,
“接受语言”:“de de”,
“接受编码”:“gzip,deflate”,
“内容类型”:“应用程序/json”,
“内容长度”:“31”,
“Referer”:https://localhost',
“连接”:“关闭”,
“来源”:https://localhost',
}
这是Burp截获的请求中的顺序:

用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:80.0)Gecko/20100101 Firefox/80.0
接受编码:gzip,deflate
接受:application/json、text/plain、*/*
连接:关闭
主机:本地主机
接受语言:de de
内容类型:application/json
内容长度:32
推荐人:https://localhost
来源:https://localhost
版本和操作系统:

windows10
python3——版本
Python 3.8.6rc1
pip冻结| findstr请求
请求==2.24.0

我发现最好的方法不是请求,而是袜子。请求库中似乎仍然存在问题。我将把它注册为github问题。下面我添加了关于袜子的代码。也许它会帮助别人

HOST = "XXX.com"
PORT = 443

payload = {"json":"data"}
Length = len(payload.encode())

headers = f"""\
POST / HTTP/1.1\r
Host: XXX.com\r
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:80.0) Gecko/20100101 Firefox/80.0\r
Accept: application/json, text/plain, \r
Accept-Language: de-DE \r
Content-type: application/json \r
Content-Length: {Length} \r
Referer: XXX.com \r
Connection: close \r
Origin: XXX.com \r
\r\n"""

context = ssl.SSLContext(ssl.PROTOCOL_SSLv23)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s_sock = context.wrap_socket(s, server_hostname=HOST)
s_sock.connect((HOST, PORT))
s_sock.send(headers.encode() + json.encode())

while True:
    data = s_sock.recv(2048)
    if ( len(data) < 1 ) :
        print(data.decode())
        break
s_sock.close()
HOST=“XXX.com”
端口=443
有效负载={“json”:“数据”}
长度=len(有效载荷.encode())
标题=f“”\
POST/HTTP/1.1\r\n
主机:XXX.com\r\n
用户代理:Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:80.0)Gecko/20100101 Firefox/80.0\r\n
接受:application/json,text/plain\r
接受语言:de de\r\n
内容类型:application/json\r\n
内容长度:{Length}\r\n
推荐人:XXX.com\r\n
连接:关闭\r\n
来源:XXX.com\r\n
\r\n“”
context=ssl.SSLContext(ssl.PROTOCOL_SSLv23)
s=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
s_sock=context.wrap_socket(服务器\u主机名=主机)
s_sock.connect((主机、端口))
s_sock.send(headers.encode()+json.encode())
尽管如此:
数据=s_sock.recv(2048)
如果(len(数据)<1):
打印(data.decode())
打破
s_sock.close()

是一个类似的问题。是的,看起来是这样,但是headers=OrderedDict()不会改变顺序。这不是你想要的吗?对不起,我表达错了。这行代码什么也不做。带和不带的顺序是相同的“错误”嗯。我需要对你的代码进行实验,以了解你的问题。将于明天恢复。