1

我正在探索 jsonrpc 2 的 Web 服务。我对 java rmi 有一些经验,非常喜欢。为了让事情变得简单,我使用了 zend 框架,所以我想我喜欢使用那个库。但是,我缺少一件事。如何使程序发回对其他对象的引用。

我知道这不在协议范围内,因为它与程序有关,但它仍然是有用的东西。与 java rmi 一样,我可以通过值(序列化)或引用(远程对象代理)选择要发送的对象。那么解决这个问题的最佳方法是什么?大多数图书馆对此有什么标准吗?

我在谷歌上花了几个小时来寻找这个并且可以想到一个解决方案(比如返回一个 url)但是,我宁愿使用一个标准然后设计一些新的东西。

还有一件事我想听听你的意见。我听说了架构师 rand 关于发送批量呼叫的协议功能。被认为是好的还是肮脏的?(他认为它们丑陋,但我可以想到用)

更新

我认为最好的方法是返回一个带有 url 的 remoteref 对象。这样它只有一个小包装和一个小文档。但是我想知道是否有一种常见的方法可以做到这一点。

SMD 可能性

可能有某种方法可以在我的 smd 中指定返回类型,是否有人对如何在我的 smd 返回类型中提供对另一个页面的引用有想法?或者有人知道 zend_json_smd 类的好解释吗?

4

1 回答 1

0

您不能通过 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
  • 下载和处理smdURL
  • 为通过 API 公开的每个过程创建一个本地代理方法(在对象代理中),以便它们在remote_id每次调用时将其传递给服务器(以便服务器知道哪个远程对象代理映射到哪个服务器端对象。)

虽然这种方案可行,但有很多移动部件,而且客户端的代码比普通 JSON-RPC 更大、更复杂。

JSON-RPC 本身并没有很好地标准化,因此大多数扩展(甚至 SMD)只是围绕方法名称和有效负载的约定。

于 2012-11-14T07:44:28.333 回答