我的设置是一个基于烧瓶的服务器。该项目的总体情况是:基于Flask的服务器根据一些算法计算从aws3获取二进制数据(比如找出要从S3获取的文件名),并将数据提供给HTML+JavaScript客户端。在
起初,我认为JSON对象是最好的响应类型。我使用以下格式(可能语法不正确)创建了一个JSON响应:
{
'payload': [
{
'symbol': 'sym',
'exchange': 'exch',
'headerfile': {
'name': '#name',
'content': '#binarycontent'
},
'datafiles': [
{
'name': '#name',
'content': '#binarycontent'
},
{
'name': '#name',
'content': '#binarycontent'
}
]
},
'errors': [ //errors ]
}
对于JSON中的任何语法错误,我深表歉意;我有点想找出一个小错误。 在构造了这个JSON之后,我知道JSON本身并不支持其中的二进制数据。因此,我不能将二进制数据作为值嵌入到JSON中。在
我意识到我总是可以将字节转换成base64编码的字符串,并在JSON中使用该字符串作为值。但是,结果字符串的大小大约增加了30%;4010个字节的数据被编码成5348个字节,虽然这对于单个二进制块来说无关紧要,但在JSON响应中嵌入大量这样的二进制块时,我的客户认为这是一个问题。由于额外的大小,响应需要更多的时间到达客户机,这是我的客户机应用程序的一个关键问题。在
我考虑的另一个选择是将二进制块作为octet-stream Content-Type
流式传输给客户机。但我不确定它是否比上述解决方案更好。而且,在这种情况下,我还不知道如何将二进制块和它们的名称联系起来。在
有没有比“将二进制转换为文本并嵌入JSON”更好的解决方案?在
我解决了这个问题,并会写下解决方案,希望它能节省别人的时间。在
谢谢你,@dstromberg和@LukasGraf提供的建议。我首先检查了BSON,发现它足以满足我的需求,所以从未深入研究Procotol Buffer的细节。在
PyPi上的BSON分为两个包。在pymongo中,它是对MongoDB的补充。在bson中,它是一个独立的包,显然适合我的需要。但是,它只支持Python2。 因此,在推出我自己的端口之前,我四处寻找Python3实现,并在bsonspec.org:Link to the module上找到了另一个BSON规范的实现。在
该模块的最简单用法如下:
如您所见,它也可以容纳二进制数据。 我以
mimetype=application/bson
的形式从Flask发送数据,接收的JavaScript使用MongoDB团队提供的this standalone BSON library对其进行精确解析。在相关问题 更多 >
编程相关推荐