繁体   English   中英

JSON / Base64中的Pyro4编码

[英]Pyro4 Encoding in JSON/Base64

因此,我有一个使用Pyro4(Python远程对象)的简单应用程序。 有一个公开的类API ,我有一个文件调用函数api.parse(input,userid) ,该文件返回一些依赖于输入的JSON。 但是,它不是简单地以字符串形式返回结果(如以前那样),而是返回{'data': 'eyJlcnJvciI6ICJDb21tYW5kIG5vdCByZWNvZ25pc2VkIn0=', 'encoding': 'base64'} ,其中base64是应返回parse的JSON字符串。

我对为什么它不起作用感到非常困惑-我之前已经对其进行了测试,并且没有问题,该字符串只是使用了奇怪的base64编码返回的。 我唯一能想到的就是我已经更改了网络(从学校连接到家庭连接),但是我不认为这应该是一个问题吗? 我已经准备了一些指示问题的代码的MVE。

testserver.py

import Pyro4;
import json;

@Pyro4.expose
class API:
    def parse(self,buff,userid):
        return prep({"error":"Command not recognised"});

def prep(obj):
    return json.dumps(obj).encode("utf-8");

# Pyro stuff
daemon = Pyro4.Daemon()                # make a Pyro daemon
ns = Pyro4.locateNS()                  # find the name server
uri = daemon.register(API)   # register the greeting maker as a Pyro object
ns.register("testAPI", uri)   # register the object with a name in the name server
daemon.requestLoop()

testclient.py

import Pyro4;
import json;

api = Pyro4.Proxy("PYRONAME:testAPI");
resp = api.parse("whatever","something");
print(resp); # Produces {'data': 'eyJlcnJvciI6ICJDb21tYW5kIG5vdCByZWNvZ25pc2VkIn0=', 'encoding': 'base64'}
# I just want b'{"error":"Command not recognised"}'

注–在parse()应用prep的阶段进行打印会得到预期的结果b'{"error":"Command not recognised"}' 我也使用命令python3 -m Pyro4.naming启动名称服务器(如果同样重要)。 我在想可能是某些全局设置/常量未正确设置或其他原因-欢迎所有回复,谢谢!

Pyro使用的默认序列化协议是蛇,这是基于文本的协议。 这意味着它无法传输二进制数据(字节),除非将其编码为文本格式(采用您发现的方式进行编码)。

您可以在客户端代码中使用一些帮助程序功能( serpent.tobytes ),该功能可以根据需要自动检测并转换响应,请参见手册本节中的信息框: https : //pythonhosted.org/Pyro4/ tipstricks.html?highlight = base64#binary-data-transfer-file-transfer

当然,如果首先创建由服务器字符串发送的数据,则无需这样做。 (但是,如果数据确实二进制的,例如图像或声音片段等,则无法执行此操作)

在您使用json文本的情况下,如果对其encode它将转换为字节 正如您所发现的,根本不需要这样做,只需将其保留为字符串即可,不会遇到任何问题。 (这让我想到了一个问题,为什么您仍然在客户端中对utf-8字节进行编码?)

事实证明,Pyro不喜欢尝试发送原始字节-而是将字节转换为base64,然后将其作为JSON发送。 所以要解决,我改变了:

def prep(obj):
    return json.dumps(obj).encode("utf-8");

def prep(obj):
    return json.dumps(obj);

并将编码位放入客户端。

暂无
暂无

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

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