jsonrpc2返回远程引用

时间:2011-11-18 19:16:50

标签: zend-framework json-rpc smd

我正在探索jsonrpc 2来获取Web服务。我有一些java rmi的经验,非常喜欢。为了方便我使用zend框架,所以我想我喜欢使用该库。然而,有一件事我想念。如何使过程发回对其他对象的引用。

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

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

还有一件事我希望你的意见。我听到一位建筑师对协议发送批量呼叫的功能提出了异议。被认为是好看还是脏? (他认为他们丑陋但我能想到当时使用)

更新

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

SMD Posibilitie's

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

1 个答案:

答案 0 :(得分: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初始化
  • 下载&处理smd网址
  • 为通过API公开的每个过程创建本地代理方法(在对象代理中),以便它们在每次调用时将remote_id传递给服务器(以便服务器知道哪个远程对象代理映射到哪个服务器端对象。)

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

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