Python请求使用二进制数据发送文本

时间:2017-12-06 23:47:24

标签: python get python-requests codec

我正在尝试使用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错误。

我试图做的不可能吗?如果我只能发送回二进制数据,但是使用自定义标题,那也可以,并且有关如何设置它们的帮助将不胜感激。

提前致谢。

1 个答案:

答案 0 :(得分:3)

HTTP响应如下所示:

HTTP/1.1 200 OK
<headers>
<blank line>
<response body>

<blank line>通常包含这些字符 - \r\n,也称为CRLF

因此,当服务器发送响应时,客户端(或浏览器)可以通过查看<blank line>来区分标题和响应正文。因此,<blank line>之后的任何内容都被视为响应主体。

这意味着,最多只有 1个响应主体。因此,即使您认为您正在单独发送colorfile_data,他们仍会进行一次回复,客户会将其视为一个整体。

你可以做些什么来解决这个问题?

您需要一种方法来了解响应正文的哪个部分是color,哪个部分是file_data。您可以通过发送自定义标头和响应来实现此目的。

让我们说,您的回答如下:

HTTP/1.1 200 OK
<headers>
<blank line>
<color><file_data>

现在,您可以在响应中设置自定义标头,该标头将告诉您color变量的字节数。

例如,如果color的值为yellow且为6个字符,则表示它有6个字节。因此,您可以设置一个自定义标题,告诉您color的总长度:

HTTP/1.1 200 OK
<headers>
X-Color-Length: 6
<blank line>
<color><file_data>

然后,在客户端,您可以从X-Color-Length标头获取总字节数,并从正文中读取该字节数以获取color的值。例如:

response = requests.get(...)

color_len = response.headers['X-Color-Length']

color = response.content[:color_len]
file_data = response.content[color_len:]

更新:现在我想起来了,我已经把它变得比它应该更复杂了。您可以直接在X-Color: <color>这样的标头中发送颜色值,而不是它所拥有的字节数。