Python 使用多部分/表单数据发布请求。内容类型不正确
我们正在尝试使用python编写一个脚本(使用python请求a.t.m.)对内容必须是MultipartFormData的站点执行POST请求。 当我们使用wireshark手动(通过在站点上填写表单并发布)执行此POST请求时,出现了以下内容(简短版本): 当我们尝试使用python请求库来实现相同的结果时,会发送以下消息:Python 使用多部分/表单数据发布请求。内容类型不正确,python,urllib,python-requests,Python,Urllib,Python Requests,我们正在尝试使用python编写一个脚本(使用python请求a.t.m.)对内容必须是MultipartFormData的站点执行POST请求。 当我们使用wireshark手动(通过在站点上填写表单并发布)执行此POST请求时,出现了以下内容(简短版本): 当我们尝试使用python请求库来实现相同的结果时,会发送以下消息: Content-Type: application/x-pandoplugin Content-Disposition: form-data; name="name";
Content-Type: application/x-pandoplugin
Content-Disposition: form-data; name="name"; filename="name"\r\n
Media type: application/x-pandoplugin (12 Bytes)
//and then in this piece is what we posted://
John Doe
奇怪的是,数据包的“一般类型”确实是多部分/表单数据,但发送的单个项目(key='name',value='johndoe')的类型是application/x-pandoplugin(我想是我电脑上的随机应用程序)
这是使用的代码:
response = s.post('http://url.com', files={'name': 'John Doe'})
是否有方法指定单个项目的内容类型,而不是使用headers参数(该参数仅更改“整个”数据包的类型)
我们认为服务器无法正确响应,因为它无法理解我们发送的内容类型
小更新:
我认为多部分内容的不同部分现在与我在浏览器中发布文章时发送的内容相同,所以这很好。但服务器实际上并没有执行我随脚本发送的更改。唯一不同的是不同部分的顺序
例如,这是我的浏览器发送的内容:
Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n
Encapsulated multipart part: (text/plain)
Content-Disposition: form-data; name="file"; filename="ex.txt"\r\n
Content-Type: text/plain\r\n\r\n
Line-based text data: text/plain
lore ipsum blabbla
Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="seq"\r\n\r\n
Data (2 bytes)
Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="name"\r\n\r\n
Data (2 bytes)
这就是脚本(使用python请求)发送的内容:
服务器是否可能依赖零件的订单?据报道,很明显是这样的?如果是这样,是否可以使用请求库显式强制执行订单?
在这种情况下,更糟糕的是:文件和文本值混合在一起
因此,强制执行订单似乎相当困难。这是我目前的做法:
s.post('http://www.url.com', files=files,data = form_values)
EDIT2:
我在requests插件中做了修改,以确保部件的顺序与原始请求中的顺序相同。这并不能解决问题,所以我想我的问题没有直接的解决方案。我会给网站的开发者发封邮件,希望他们能帮助我 您的代码看起来是正确的
requests.post('http://url.com', files={'name': 'John Doe'})
。。。并应发送“多部分/表单数据”帖子
事实上,我收到了如下帖子:
Accept-Encoding: gzip, deflate, compress
Connection: close
Accept: */*
Content-Length: 188
Content-Type: multipart/form-data; boundary=032a1ab685934650abbe059cb45d6ff3
User-Agent: python-requests/1.2.3 CPython/2.7.4 Linux/3.8.0-27-generic
--032a1ab685934650abbe059cb45d6ff3
Content-Disposition: form-data; name="name"; filename="name"
Content-Type: application/octet-stream
John Doe
--032a1ab685934650abbe059cb45d6ff3--
我不知道你为什么会得到奇怪的内容类型标题:
Content-Type: application/x-pandoplugin
我将首先从您的机器上完全删除PandoWeb插件,然后再次尝试您的python请求代码。(或者从另一台机器上尝试)Python使用系统范围的配置文件来“猜测”文件的mime类型。如果这些插件正在用它们的自定义mime类型注册你的文件扩展名,那么你最终会把它放进去 最安全的方法是根据您发送的特定服务器进行自己的mime类型猜测,并且只对您没有想到的扩展使用本机python mime类型猜测
我不知道如何使用python请求手动指定内容类型,但我认为这应该是可能的。到今天为止,您可以执行以下操作:
response = s.post('http://url.com', files={'name': (filename, contents, content_type)})
我们在不同的机器上试过。另一个是application/x-uplaypc。看起来随机插件“接管”了默认的内容类型。我也不知道为什么会发生这种情况。这是非常值得怀疑的,但你们使用netrc吗?不,至少我不知道。我想我几乎解决了这个问题,所以请看一下更新的问题。既然你是请求的合作者,也许你知道答案?提前谢谢@对于不同的名称和文件名值,您有什么建议?例如:
name=“name”;filename=“something other”内容类型:video/mp4
请帮助。
Content-Type: application/x-pandoplugin
response = s.post('http://url.com', files={'name': (filename, contents, content_type)})