繁体   English   中英

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错误。

我试图做的事是不可能的吗? 如果我只能使用自定义标头发送回二进制数据,那也可以,并且对如何设置这些标定会有所帮助。

提前致谢。

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>类的标头中直接发送颜色的值,而不是发送它具有的字节数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM