我们正在尝试用
python编写一个脚本(使用python-requests a.t.m.)来对内容必须是MultipartFormData的站点发出POST请求.
当我们手动执行此POST请求时(通过填写网站上的表单并发布),使用wireshark,这就出现了(简短版本):
Content-Type: multipart/form-data;
Content-Disposition: form-data; name="name"
Data (8 Bytes)
John Doe
当我们尝试使用python-requests库来实现相同的结果时,会发送:
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 =’John Doe’)具有类型application / x-pandoplugin(随机的)应用在我的电脑上我猜).
这是使用的代码:
response = s.post('http://url.com', files={'name': 'John Doe'})
有没有办法指定单个项的内容类型而不是使用headers参数(只更改’整个’数据包的类型)?
我们认为服务器没有正确响应,因为它无法理解我们发送它的内容类型.
小更新:
我认为多部分内容的不同部分现在与我在浏览器中执行POST时发送的部分相同,所以这很好.服务器实际上并没有执行我用脚本发送的更改.唯一不同的是不同部分的顺序.
例如,这是我的浏览器发送的内容:
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-requests)发送的内容:
Boundary: \r\n------WebKitFormBoundary3eXDYO1lG8Pgxjwj\r\n
Encapsulated multipart part:
Content-Disposition: form-data; name="name"\r\n\r\n
Data (2 bytes)
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)
服务器是否可能依赖于部件的顺序?根据Multipart upload form: Is order guaranteed?,它显然是?如果是这样,是否可以使用请求库明确强制订单?
并且在这种情况下使事情变得更糟:文件和文本值混合在一起.
所以强迫订单似乎相当困难.这是我目前的做法:
s.post('http://www.url.com', files=files,data = form_values)
EDIT2:
我在requests插件中做了一个修改,以确保部件的顺序与原始请求中的顺序相同.这不能解决问题所以我想我的问题没有直接的解决方案.我会发送邮件给网站的开发者,希望他们可以帮助我!