Выполнение вызовов Json-Rpc из Java
Я пишу Java-приложение, которое работает на локальной машине, оно должно взаимодействовать с другой программой (также работающей на локальной машине), другая программа имеет JSON RPC API, который является лучшим способом взаимодействия с ней. Однако в процессе поиска я нашел много библиотек для представления методов JSON RPC из Java-приложения, но ничего хорошего в том, как вызвать удаленный метод JSON. Как бы я это сделал?
Две вещи, которые я ищу:
- Способ создания новых объектов JSON для отправки
- Способ подключиться к другой программе и отправить мой ответ
- Способ декодирования ответа 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.