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 返回远程引用的主要内容,如果未能解决你的问题,请参考以下文章

php api 未经授权的请求 json rpc 2.0

JSON RPC 2.0:请求对象上的额外字段是不是违反规范?

在具有双向支持的 java 中实现 jsonrpc 2.0 的最佳库

在实现 JSONRPC 2.0 服务器时,是不是需要同时支持命名参数和位置参数?

在 PHP 中使用 CURL 调用 JSON RPC 2.0 API - Changelly API

适用于 Android 的最佳 json rpc 2.0 库 [关闭]