gpt4 book ai didi

Python - 有序 header HTTP 请求

转载 作者:行者123 更新时间:2023-12-04 20:31:34 27 4
gpt4 key购买 nike

我目前正在使用 python 2.7 requests 库,并且不支持有序 header 。我可以为 post 和 get 放置有序数据(如有序字典),但根本不支持标题。甚至在 python 3 中也没有

我知道 HTTP 协议(protocol) RFC,表明 header 的顺序无关紧要,但问题是我正在实现的第 3 方服务不起作用,除非 header 按顺序排列。我知道这一点是因为我已经用其他语言实现了有序 header 请求并且它可以工作(如 java),是的,我 100% 确定这一点,因为我检查了 burp 和wireshark 以确保这是请求之间的唯一区别.但是我在 python 中已经有 5,000 多行,所以迁移是因为这样一个问题而做出的一个痛苦的决定。

我想到的唯一解决方案是自己在 TCP 之上实现 http 协议(protocol),但这不是一个聪明的解决方案。我无法拥有与可用解决方案相同质量的代码,这可能是我的代码的故障点。

请参阅下面的简化代码示例:

data=(("param1","something"),
("param2","something_else"))

headers={'id': 'some_random_number',
'version':'some_random_number' ,
'signature':'some_random_number' ,
'Content-Type':'application/x-www-form-urlencoded' ,
'charset':'utf-8' ,
'Content-Length':str(len(urllib.urlencode(data))) ,
'name':'random' ,
'User-Agent':'Firefox' ,
'Connection':'Keep-Alive' ,
'Accept-Encoding':'gzip'}

requests.post("myservice.com",headers=headers, data=data)

请求 header 的顺序是这样发送的(不是实际的顺序,只是一个例子来说明我的意思)
'version':'some_random_number' 
'Accept-Encoding':'gzip'
'id': 'some_random_number'
'User-Agent':'Firefox'
'signature':'some_random_number'
'Connection':'Keep-Alive'
'Content-Type':'application/x-www-form-urlencoded'
'charset':'utf-8'
'name':'random'

这对我来说是个问题。我现在不知道该怎么办。非常感谢任何帮助。我试过 urllib 库不支持

最佳答案

扩展评论,这是一个非常非常简单的 OrderedHeadersrequests可能会满意:

class OrderedHeaders(object):

def __init__(self, *headers):
self.headers = headers

def items(self):
return iter(self.headers)


oh = OrderedHeaders(('Accept-Charset', 'Foo'), ('Bar', 'Foobar'))

for k, v in oh.items():
print("%s:%s" % (k, v))

这是一个更详细的示例,它使用 topological sorting确定哪些标题必须在其他标题之前给出。它需要更多的代码,但是您可以清楚地说明您的标题必须有一次排序,然后像使用任何其他 dict 一样使用该类。
import sys
import toposort

class OrderedHeaders(dict):
# The precedence of headers is determined once. In this example,
# 'Accept-Encoding' must be sorted behind 'User-Agent'
# (if defined) and 'version' must be sorted behind both
# 'Accept-Encoding' and 'Connection' (if defined).
PRECEDENCE = toposort.toposort_flatten({'Accept-Encoding': {'User-Agent'},
'version': {'Accept-Encoding',
'Connection'}})

def items(self):
s = []
for k, v in dict.items(self):
try:
prec = self.PRECEDENCE.index(k)
except ValueError:
# no defined sort for this header, so we put it behind
# any other sorted header
prec = sys.maxsize
s.append((prec, k, v))
return ((k, v) for prec, k, v in sorted(s))

# Initialize like a dict
headers = OrderedHeaders(name='random', Connection='Keep-Alive')
...
# Setting more values
headers['Accept-Encoding'] = 'gzip'
headers['version'] = '0.1'
headers['User-Agent'] = 'Firefox'
...
# Headers come out of '.items()' like they should
for k, v in headers.items():
print("%s: %s" % (k, v))

打印
Connection: Keep-Alive
User-Agent: Firefox
Accept-Encoding: gzip
version: 0.1
name: random

因为 Connection需要先到 version , User-Agent需要先到 Accept-Encoding , Accept-Encoding需要先到 versionname没有排序,因此放在最后。

您可以在 OrderedHeaders 上设置值以您想要的任何顺序,在 .items() 中进行排序.但是,您可以确定始终可以进行合理的排序:如果您犯了错误并定义了循环依赖项(例如,“版本”>“用户代理”>“版本”),您将得到 toposort.CircularDependencyError在“编译时”。

关于Python - 有序 header HTTP 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44864896/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com