jsonrpc2 返回远程引用
Posted
技术标签:
【中文标题】jsonrpc2 返回远程引用【英文标题】:jsonrpc2 returning remote reference 【发布时间】:2011-11-18 19:16:50 【问题描述】:我正在探索用于 Web 服务的 jsonrpc 2。我对 java rmi 有一些经验,非常喜欢。为了让事情变得简单,我使用了 zend 框架,所以我想我喜欢使用那个库。但是,我缺少一件事。如何使程序发回对其他对象的引用。
我知道这不在协议范围内,因为它与程序有关,但它仍然是有用的。与 java rmi 一样,我可以通过值(序列化)或引用(远程对象代理)选择要发送的对象。那么解决这个问题的最佳方法是什么?大多数图书馆都在使用这方面的标准吗?
我在 google 上花了很多时间寻找这个,并且可以想到一个解决方案(比如返回一个 url),但是,我宁愿使用一个标准然后设计一些新的东西。
还有一件事我想听听你的意见。我听过一位架构师 rand 关于协议发送批量呼叫的特性。被认为是好的还是肮脏的? (他认为它们丑陋,但我可以想到用)
更新
我认为最好的方法是返回一个带有 url 的 remoteref 对象。这样它只有一个小包装和一个小文档。但是我想知道是否有一种常用的方法来做到这一点。
SMD 可能性
可能有一些方法可以在我的 smd 中指定返回类型,有没有人知道如何在我的 smd 返回类型中提供对另一个页面的引用?或者有人知道 zend_json_smd 类的好解释吗?
【问题讨论】:
【参考方案1】:您不能通过 JSON-RPC 返回任何类型的引用。
没有这样做的标准(afaik),因为 RPC 是无状态的,并且大多数开发人员更喜欢这种方式。这种简单性使得 JSON-RPC 对 SOAP(和其他混乱)的客户端开发人员如此受欢迎。
但是,您可以在返回值中采用约定,即某些 JSON 构造应被视为“提示”以制造远程“对象”代理。例如,您可以创建一个经过修改的 JSON 反序列化器,它会变成:
"__remote_object":
"class": "Some.Remote.Class",
"remote_id": 54625143,
"smd": "http://domain/path/to/further.smd",
"init_with": ... Initial state of object ...
通过以下方式进入远程对象代理:
使用以class
命名的原型创建本地对象,通过init_with
初始化
下载和处理smd
URL
为通过 API 公开的每个过程创建本地代理方法(在对象代理中),以便它们在每次调用时将 remote_id
传递给服务器(以便服务器知道哪个远程对象代理映射到哪个服务器-side 对象。)
虽然这种方案可行,但有很多移动部件,而且客户端的代码比普通 JSON-RPC 更大、更复杂。
JSON-RPC 本身并没有很好地标准化,因此大多数扩展(甚至 SMD)只是围绕方法名称和有效负载的约定。
【讨论】:
这是解决问题的好方法是的。到目前为止,我的项目是 stateles,这使代码更好。但这是一种“提示”远程引用的好方法。 (抱歉回复晚了)以上是关于jsonrpc2 返回远程引用的主要内容,如果未能解决你的问题,请参考以下文章
JSON RPC 2.0:请求对象上的额外字段是不是违反规范?
在具有双向支持的 java 中实现 jsonrpc 2.0 的最佳库
在实现 JSONRPC 2.0 服务器时,是不是需要同时支持命名参数和位置参数?