Python requests - 在HTTP请求中POST Multipart/form-data不带文件名
我正在尝试用Python的requests模块复制一个POST请求:
POST /example/asdfas HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Content-Type: multipart/form-data; boundary=---------------------------241652170216373
Content-Length: 279
-----------------------------241652170216373
Content-Disposition: form-data; name="value_1"
12345
-----------------------------241652170216373
Content-Disposition: form-data; name="value_2"
67890
-----------------------------241652170216373--
根据requests的文档,建议使用files这个参数。
当我尝试以下调用时:
import requests
requests.post('http://example.com/example/asdfas', files={'value_1': '12345',
'value_2': '67890'})
我得到了以下的HTTP请求:
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, compress',
'Content-Length': '264',
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7',
'Content-Type': 'multipart/form-data; boundary=273f13699c02429db4eb95c97f757d38'
--273f13699c02429db4eb95c97f757d38
Content-Disposition: form-data; name="value_1"; filename="value_1"
12345
--273f13699c02429db4eb95c97f757d38
Content-Disposition: form-data; name="value_2"; filename="value_2"
67890
--273f13699c02429db4eb95c97f757d38--
我也尝试过使用data这个参数:
import requests
requests.post('http://example.com/example/asdfas', data={'value_1': '12345',
'value_2': '67890'})
结果是以下的HTTP请求:
'Content-Type': 'application/x-www-form-urlencoded',
'Content-Length': '27',
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7',
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, compress'
value_2=67890&value_1=12345
我遇到的问题是,使用files参数时,服务器无法识别这个请求,可能是因为HTTP请求中发送了意外的“filename”信息。而使用data参数则发送了错误的Content-Type头。
我知道第一个请求在我想发送请求的服务器上是有效的——那么,怎样的函数调用才能完全复制第一个HTTP请求呢?
编辑:
用于复制有效请求的示例HTML表单:
<!DOCTYPE html>
<html>
<head>
<title></title>
</head>
<body>
<form action="http://example.com/example/asdfas" method="post" enctype="multipart/form-data">
<label for="v1">Value 1</label>
<input id="v1" type="text" name="value_1">
<label for="v2">Value 2</label>
<input id="v2" type="text" name="value_2">
<input type="submit">
</form>
</body>
</html>
2 个回答
-3
这段代码是用来处理一些特定的功能的。它可能涉及到一些数据的操作或者是与用户交互的部分。具体来说,代码块中的内容会根据不同的情况执行不同的任务。
如果你看到一些看起来复杂的语法,不用担心,很多时候它们都是在告诉计算机该怎么做。就像我们给别人下达指令一样,代码也是在给计算机发指令。
总之,这段代码的目的是为了实现某种功能,具体的细节可能需要结合上下文来理解,但大体上就是在告诉计算机如何处理信息。
import requests
from requests_toolbelt import MultipartEncoder
url = 'http://example.com/example/asdfas'
fields = {'value_1':'12345', 'value_2': '67890'}
data = MultipartEncoder(fields=fields)
headers["Content-type"] = m.content_type
requests.post(url=url, data=data, headers=headers)
68
解决办法是使用元组来传递参数给文件参数:
import requests
requests.post('http://example.com/example/asdfas', files={'value_1': (None, '12345'), 'value_2': (None, '67890')})
这样就能正常工作了:
'Accept': '*/*',
'Accept-Encoding': 'gzip, deflate, compress',
'Content-Length': '228',
'User-Agent': 'python-requests/2.2.1 CPython/3.3.2 Windows/7',
'Content-Type': 'multipart/form-data; boundary=85e90a4bbb05474ca1e23dbebdd68ed9'
--85e90a4bbb05474ca1e23dbebdd68ed9
Content-Disposition: form-data; name="value_1"
12345
--85e90a4bbb05474ca1e23dbebdd68ed9
Content-Disposition: form-data; name="value_2"
67890
--85e90a4bbb05474ca1e23dbebdd68ed9--