Выполнение вызовов Json-Rpc из Java

Я пишу Java-приложение, которое работает на локальной машине, оно должно взаимодействовать с другой программой (также работающей на локальной машине), другая программа имеет JSON RPC API, который является лучшим способом взаимодействия с ней. Однако в процессе поиска я нашел много библиотек для представления методов JSON RPC из Java-приложения, но ничего хорошего в том, как вызвать удаленный метод JSON. Как бы я это сделал?

Две вещи, которые я ищу:

  1. Способ создания новых объектов JSON для отправки
  2. Способ подключиться к другой программе и отправить мой ответ
  3. Способ декодирования ответа JSON

4 ответа

Решение

Для взаимодействия с текстом JSON в Java см. JSON в Java. Используйте это для построения объектов запроса JSON и их сериализации в текст, а также для десериализации ответа от сервера RPC.

Это через HTTP или обычное TCP соединение? Если первое, используйте HTTPClient, Если последнее, просто откройте сокет и используйте его потоки ввода / вывода.

Я нашел пару очень хороших библиотек Java JSON-RPC. Оба бесплатны. JSON-RPC 2 действительно высокого качества, и я также могу порекомендовать некоторые другие его работы. jsonrpc4j кажется завершенным, но я не использовал его. Обе эти библиотеки решают несколько проблем, так что вам не нужно иметь дело с низкоуровневой реализацией.

Кроме того, Google GSON - это отличная библиотека для сериализации Java-объектов в JSON. Если у вас сложный 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;
        }

Источник адаптирован с: https://code.google.com/p/android-json-rpc/source/browse/trunk/android-json-rpc/src/org/alexd/jsonrpc/JSONRPCClient.java?r=47

Или используя GSON:

Gson gson = new Gson();

JsonObject req = new JsonObject();
req.addProperty("id", id);
req.addProperty("method", methodName);

JsonArray params = new JsonArray();
if (args != null) {
    for (Object o : args) {
        params.add(gson.toJsonTree(o));
    }
}
req.add("params", params);

String requestData = req.toString();

Из org / json / rpc / client /JsonRpcInvoker.java из json-rpc-client

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 из json-rpc-client

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, так что это не проверено и может не скомпилироваться как есть, но должно дать вам хорошую основу для работы.

Использование библиотеки JSON для создания объектов JSON: http://www.json.org/java/, Lib: http://json-lib.sourceforge.net/

Во-первых, вызов JSON будет вызовом AJAX для некоторого URL. URL должен возвращать содержимое JSON с типом содержимого, установленным в "application / json".

Вы можете сделать новый сервлет, в ответ установите выше тип контента, Сделайте новый JSONObject, поместите ваши объекты в него и напишите JSONObject.toString() в ответ.

Таким образом, клиент получит строку JSON. Вы можете получить к нему доступ, используя простой Javascript ИЛИ jQuery.

Вы можете создать специальный сервлет только для поддержки JSON, который обрабатывает только запросы JSON AJAX и возвращает правильные ответы JSON.

Parth.

Другие вопросы по тегам