我正在尝试在REST和JSON-RPC之间进行选择,以便为Web应用程序开发API.哪一个更容易用于API客户端?
更新2015:我发现REST更易于开发和使用在Web/HTTP上提供的API,因为API可以利用客户端和服务器都能理解的现有和成熟的HTTP协议.例如,API可以使用响应代码,标题,查询,帖子正文,缓存和许多其他功能,而无需任何额外的工作或设置.
我正在开发一个Android应用程序,它获取名为"WebUntis"的Web服务的json内容.我得到的Json内容看起来像:
{"jsonrpc":"2.0","id":"req-002",
 "result":[
    {"id":125043,"date":20110117,"startTime":800,"endTime":850,
     "kl":[{"id":71}],
     "te":[{"id":23}],
     "su":[{"id":13}],
     "ro":[{"id":1}]},
    {"id":125127,"date":20110117,"startTime":1055,"endTime":1145,
     "kl":[{"id":71}],
     "te":[{"id":41}],
     "su":[{"id":19}],
     "ro":[{"id":31}]},
...]}
正如您在结果数组中看到的那样,还有其他数组,如"kl","su"和"ro"
我正在获取这些数组的内容,然后我将它们存储在一个arraylist中.但是,当其中一个数组为空时,就像;
    {"jsonrpc":"2.0","id":"req-002",
     "result":[
         {"id":125043,"date":20110117,"startTime":800,"endTime":850,
          "**kl":[]**,
          "te":[{"id":23}],
          "su":[{"id":13}],
          "ro":[{"id":1}]},
         {"id":125127,"date":20110117,"startTime":1055,"endTime":1145,
          "kl":[{"id":71}],
          "te":[{"id":41}],
          "su":[{"id":19}],
          "ro":[{"id":31}]},
...]}
我总是得到错误IndexOutOfRangeException,但我总是告诉它它不应该采用空数组,这是我尝试过的:
 JSONObject jsonResult = new JSONObject(s);
 // Get the result object
 JSONArray arr = jsonResult.getJSONArray("result");
 for (int i = 0; i < arr.length(); i++) {
    JSONObject c = arr.getJSONObject(i);
    anfangStunde[i] = c.getString("startTime");
    endeStunde[i] = c.getString("endTime");
    // get the jsonarrays (kl, su, ro)
    kl = c.getJSONArray("kl");
    su = c.getJSONArray("su");
    ro …任何人都可以推荐一些简单的代码来设置一个简单的JSON RPC客户端和服务器使用twisted?
我找到了txJSON-RPC,但我想知道是否有人有一些使用这些anc的经验可以推荐一些东西.
我不明白JSON RPC中的ID是什么.另外,在开发工具包时,考虑不使用JSON-RPC.org的标准有多糟糕?在JSON-RPC世界中似乎存在一些歧义.
PS我所指的ID是这里的ID:
{"params":["Hello","World"],"method":"hello_world","id":1}
Helllo,我想在python和进程之间共享少量数据(<1K).数据是物理pc/104 IO数据,它们经常快速变化(24x7x365).将有一个"服务器"写入数据,多个客户端读取它的一部分.这将运行的系统使用闪存(CF卡)而不是硬盘驱动器,所以我担心使用基于文件的方案磨损闪存.我也希望使用更少的功率(处理器时间),因为我们100%太阳能供电.
谢谢
更新:我们将最大数据更新速率降低到大约10 Hz,但更典型的是1 Hz.客户端仅在值更改时通知,而不是以不断更新的速率通知.我们已经进入了多服务器/多客户端模型,其中每个服务器都专注于某种类型的仪器或功能.由于事实证明大部分编程都是由Java程序员完成的,我们最终使用的是JSON-RPC over TCP.服务器将用Java编写,但我仍然希望用Python编写主客户端并调查JSON-RPC实现.
我正在使用json-rpc-1.0.jar.Below是我的代码.我需要将InputStream对象转换为JSON,因为响应是在JSON中.
我确实验证了从Zappos API获得的json响应.这是有效的.
PrintWriter out = resp.getWriter();
String jsonString = null;
URL url = new URL("http://api.zappos.com/Search?term=boots&key=my_key");
InputStream inputStream = url.openConnection().getInputStream();
resp.setContentType("application/json");
JSONSerializer jsonSerializer = new JSONSerializer();
try {
   jsonString = jsonSerializer.toJSON(inputStream);
} catch (MarshallException e) {
 e.printStackTrace();
    }
out.print(jsonString);
我得到以下提到的例外:
com.metaparadigm.jsonrpc.MarshallException: can't marshall sun.net.www.protocol.http.HttpURLConnection$HttpInputStream
    at com.metaparadigm.jsonrpc.JSONSerializer.marshall(JSONSerializer.java:251)
    at com.metaparadigm.jsonrpc.JSONSerializer.toJSON(JSONSerializer.java:259)
    at Communicator.doGet(Communicator.java:33)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:740)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:853)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193)
    at filters.ExampleFilter.doFilter(ExampleFilter.java:149)
我正在开发一个Web应用程序,它将广泛使用AJAX技术进行客户端/服务器通信......特别是JSON-RPC.Zend Framework正在服务器端使用,它提供了一个很好的JSON-RPC服务器,我想使用它.
我的目标是构建一个可维护的系统,将大量服务器端功能暴露给客户端(javascript),而不会产生不必要的代码重复.我已经看过很多关于如何使用ZF的JSON-RPC服务器的博客文章和教程(见这里和这里),但它们似乎都面向暴露一个小型的公共可用API.代码重复很常见,例如一篇博文有以下暴露方法:
public static function setTitle($bookId, $title) {
    $book = new Nickel_Model_Book($bookId);
    $book->setTitle($title);
    $book->update();
    return true;
}
我不喜欢有两种setTitle方法的事实.如果一个方法签名发生变化,另一个必须保持同步...如果你的API很广泛,似乎是一个可维护性的噩梦.在我看来应该有一个Book类,有一种setTitle方法.
我最初的想法是为@export我想要暴露的方法/类添加一个docblock注释.当我决定公开setTitle方法时,我只是添加注释而不是新方法.
我看到的一个潜在问题涉及对象持久性.在服务器端,setTitle设置对象的title属性是有意义的......但是在update()调用之前不会将其保留在数据库中.客户端,调用setTitle应立即影响数据库.一种可能的解决方案是修改所有访问器,使得它们采用可选的第二个参数,表示修改应立即更新数据库:
function setTitle($title, $persist = false) {
    $this->title = $title;
    if ($persist) $this->update();
}
某种代理类可以确保$persist为所有客户端RPC调用设置标志.
另一个问题是PHP对象的序列化.在服务器端,进行OO风格的$book->setTitle("foo")调用book.setTitle(1234, "foo")是有意义的,但由于缺乏状态,客户端是有意义的(其中1234是本书的ID).我的解决方案是让上述代理类负责以某种方式book.setTitle(1234, "foo")变成:
$book = new Book();
$book->load(1234);
return $book->setTitle($title);
我觉得这个问题必须先解决或讨论过......但我在网上找不到很多资源.这看起来像是一个理智的解决方案吗?
我正在试图找到一种方法来编写一个可以与json-rpc服务通信的Java应用程序(该服务是一个python twisted服务器).
然而,我还没有找到一个体面的图书馆,里面有一些很好的例子(我已经用谷歌搜索了6个小时).
那么Java中是否存在任何库,或者是否存在更加繁琐的低级方法.
我将实现JSON-RPC Web服务.我需要这个规格.到目前为止,我发现只有一种资源可以被称为真正的规范:
但是我已经看到像Dojo这样的JavaScript框架主动使用JSON-RPC SMD
但它需要JSON Schema规范,但它会重定向到错误的URL作为参考.到目前为止,我发现了以下内容:
它仍然是草案......
任何人都可以指出一些实际的规格......至少官方更新了什么?因为看起来实现JSON-RPC 1.0可能还不够,至少对于像Dojo这样的框架来说.还是我错了?
问题:
JSON-RPC 1.0规范的实现是否足以为大多数现代客户端提供JSON-RPC服务,以及有多少客户端(如果有的话)实际支持JSON-RPC 1.0之外的功能(SMD,Schema,2.0) ?
因为看起来JSON-RPC 1.0只是一个具有官方规范(而不是草案)的
注意:不建议现有的JSON-RPC服务实现.
任何人?
编辑:任何人都使用JSON-RPC?
我不喜欢同时做很多事情的工具。所以 GRPC 在我看来是开销,就像 kubernetes。GRPC 实际上是结合了两件事的工具:扩展的 Protobuf(服务支持)和 HTTP2。
我读了很多文章,说使用 GRPC 对性能来说非常棒。而且有两个原因
这是主要部分:protobuf 和 HTTP2是独立的项目、工具等。有了这种理解,我可以说 GRPC 只不过是结合了几种不同的工具,比如 kubernetes 结合了 docker 和编排工具。
所以我的问题是:w ^帽的实际使用GRPC VS HTTP2任何有效载荷(CSV,XML,JSON等)的优势。
让我们跳过有关序列化的部分,因为正如我提到的 protobuf 是来自 grpc 的独立库