Python 请求发送带有二进制数据的文本
Python requests send text with binary data
我正在尝试使用 python 的请求库在服务器之间发送二进制数据和文本字符串(或任何其他普通变量)。
我有两台服务器在互相通信。 服务器 A 通过 python 的请求库发送 GET 请求。它看起来像这样:
color, file_data = requests.get('https://www.serverb.com/testing', params = {...})
服务器 B 然后执行如下操作:
var1 = request.args.get('var1')
var2 = request.args.get('var2')
# This function creates a binary file, saves it to disk, and returns the file name.
res = some_function(var1, var2)
file_data = codecs.open(res, 'rb').read()
return 'Success!', file_data
但是,当我尝试这样做时,服务器 B 抛出 500 错误。
我想做的事情是不可能的吗?如果我只能发回二进制数据,但使用自定义 headers,那也可以,如果能提供有关如何设置这些数据的帮助,我们将不胜感激。
提前致谢。
HTTP 响应如下所示:
HTTP/1.1 200 OK
<headers>
<blank line>
<response body>
<blank line>
一般包含这些字符——\r\n
,也称为CRLF
。
因此,当服务器发送响应时,客户端(或浏览器)可以通过查看 <blank line>
来区分 header 和响应 body。因此,<blank line>
之后的任何内容都被视为响应 body.
也就是说,最多只能有1个回复body只有。因此,即使您认为您像现在这样分别发送 color
和 file_data
,它们仍然会在一个响应中进行,客户端会将它们视为单个 body .
如何解决这个问题?
您需要一种方法来了解响应 body 的哪一部分是 color
,哪一部分是 file_data
。您可以通过发送自定义 header 和响应来做到这一点。
比方说,您的回复如下所示:
HTTP/1.1 200 OK
<headers>
<blank line>
<color><file_data>
现在,您可以在响应中设置自定义 header,它会告诉您 color
变量有多少字节。
例如,如果color
的值为yellow
并且是6个字符,则表示它有6个字节。因此,您可以设置自定义 header 来告诉您 color
:
HTTP/1.1 200 OK
<headers>
X-Color-Length: 6
<blank line>
<color><file_data>
然后,在您的客户端,您可以从 X-Color-Length
header 中获取总字节数,并从 body 中读取该字节数以获取 color
。示例:
response = requests.get(...)
color_len = response.headers['X-Color-Length']
color = response.content[:color_len]
file_data = response.content[color_len:]
更新:现在我想起来了,我把它弄得比它应该的要复杂一些。您可以直接在 header 中发送颜色值,例如 X-Color: <color>
,而不是它具有的字节数。