Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从java进行Json Rpc调用_Java_Json_Rpc - Fatal编程技术网

从java进行Json Rpc调用

从java进行Json Rpc调用,java,json,rpc,Java,Json,Rpc,我正在编写一个在本地机器上运行的java应用程序,它需要与另一个程序(也在本地机器上运行)交互,另一个程序有一个JSON RPC API,这是与它交互的最佳方式。然而,在谷歌搜索中,我发现了许多用于从java应用程序中公开JSON RPC方法的库,但在如何调用远程JSON方法方面没有什么好的。我该怎么做 我要找的两件事是: 一种创建新JSON对象的方法 发送 连接到 其他程序并发送我的回复 一种解码JSON响应的方法 JSON库用于生成JSON对象: , 库: 首先,JSON调用将是对某个URL

我正在编写一个在本地机器上运行的java应用程序,它需要与另一个程序(也在本地机器上运行)交互,另一个程序有一个JSON RPC API,这是与它交互的最佳方式。然而,在谷歌搜索中,我发现了许多用于从java应用程序中公开JSON RPC方法的库,但在如何调用远程JSON方法方面没有什么好的。我该怎么做

我要找的两件事是:

  • 一种创建新JSON对象的方法 发送
  • 连接到 其他程序并发送我的回复
  • 一种解码JSON响应的方法

  • JSON库用于生成JSON对象: , 库:

    首先,JSON调用将是对某个URL的AJAX调用。URL必须返回内容类型设置为“application/JSON”的JSON内容

    您可以创建一个新的servlet,在内容类型上方的响应集中,创建新的
    JSONObject
    ,将对象放入其中,并将
    JSONObject.toString()
    写入响应

    因此,客户端将获得JSON字符串。您可以使用简单的Javascript或jQuery访问它

    您可以为JSON支持创建一个特殊的servlet,它只处理JSON AJAX请求并返回正确的JSON响应


    第四部分。

    有关在Java中与JSON文本交互的信息,请参阅。用于构建JSON请求对象并将其序列化为文本,以及对来自RPC服务器的响应进行反序列化


    这是通过HTTP还是普通TCP连接?如果是前者,请使用。如果是后者,只需打开一个套接字并使用它的I/O流。

    我发现了两个非常好的Java JSON-RPC库。两者都是免费的。是非常高质量的,我也可以推荐他的一些其他作品。看起来很完整,但我没有用过。这两个库都解决了几个问题,因此您不必处理低级实现


    此外,还有一个很棒的库,用于将Java对象序列化为JSON。如果你有一个复杂的API,它会很有帮助。

    这里有一些源代码示例和项目,以演示如何创建自己的API

    1。创建要发送的新JSON对象的方法

        import java.util.UUID;
    
        import org.json.JSONArray;
        import org.json.JSONException;
        import org.json.JSONObject;
    
        protected JSONObject toJSONRequest(String method, Object[] params) throws JSONRPCException
            {
                    //Copy method arguments in a json array
                    JSONArray jsonParams = new JSONArray();
                    for (int i=0; i<params.length; i++)
                    {
                            if(params[i].getClass().isArray()){
                                    jsonParams.put(getJSONArray((Object[])params[i]));
                            }
                            jsonParams.put(params[i]);
                    }
    
                    //Create the json request object
                    JSONObject jsonRequest = new JSONObject();
                    try 
                    {
                            jsonRequest.put("id", UUID.randomUUID().hashCode());
                            jsonRequest.put("method", method);
                            jsonRequest.put("params", jsonParams);
                    }
                    catch (JSONException e1)
                    {
                            throw new JSONRPCException("Invalid JSON request", e1);
                    }
                    return jsonRequest;
            }
    
    来自org/json/rpc/client/JsonRpcInvoker.java

    2。连接到其他程序并发送我的回复的方法

    使用HTTP,您可以执行以下操作:

    URL url = new URL("http://...");
    
    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
    
    connection.setRequestMethod("POST");
    connection.setDoOutput(true);
    connection.connect();
    
    OutputStream out = null;
    try {
        out = connection.getOutputStream();
    
        out.write(requestData.getBytes());
        out.flush();
        out.close();
    
        int statusCode = connection.getResponseCode();
        if (statusCode != HttpURLConnection.HTTP_OK) {
            throw new JsonRpcClientException("unexpected status code returned : " + statusCode);
        }
    } finally {
        if (out != null) {
            out.close();
        }
    }
    
    源代码改编自org/json/rpc/client/HttpJsonRpcClientTransport.java

    3。解码JSON响应的方法

    读取HTTP响应,然后解析JSON:

    InputStream in = connection.getInputStream();
    try {
        in = connection.getInputStream();
        in = new BufferedInputStream(in);
    
        byte[] buff = new byte[1024];
        int n;
        while ((n = in.read(buff)) > 0) {
            bos.write(buff, 0, n);
        }
        bos.flush();
        bos.close();
    } finally {
        if (in != null) {
            in.close();
        }
    }
    
    JsonParser parser = new JsonParser();
    JsonObject resp = (JsonObject) parser.parse(new StringReader(bos.toString()));
    
    JsonElement result = resp.get("result");
    JsonElement error = resp.get("error");
    
    
    // ... etc
    

    请记住,我将这些来自现有JSON RPC客户端库的代码片段放在一起,因此这没有经过测试,也可能无法按原样编译,但应该为您的工作打下良好的基础。

    这似乎是在描述如何构建一个web服务来接收JSON中的请求并返回响应。提问者似乎对如何从普通Java应用程序中使用JSON RPC服务感兴趣。。。你还指定了与我指定的相同的东西。。。JSON.org:)
    InputStream in = connection.getInputStream();
    try {
        in = connection.getInputStream();
        in = new BufferedInputStream(in);
    
        byte[] buff = new byte[1024];
        int n;
        while ((n = in.read(buff)) > 0) {
            bos.write(buff, 0, n);
        }
        bos.flush();
        bos.close();
    } finally {
        if (in != null) {
            in.close();
        }
    }
    
    JsonParser parser = new JsonParser();
    JsonObject resp = (JsonObject) parser.parse(new StringReader(bos.toString()));
    
    JsonElement result = resp.get("result");
    JsonElement error = resp.get("error");
    
    
    // ... etc