Я начинаю использовать базовую реализацию Bitcoin JSON RPC ( библиотека dzhuvinov ), и получаю странный результат. Вот мой код:
public static void main(String[] args)
{
URL serverURL = null;
final String rpcuser ="user";
final String rpcpassword ="pass";
Authenticator.setDefault(new Authenticator() {
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication (rpcuser, rpcpassword.toCharArray());
}
});
try {
serverURL = new URL("http://127.0.0.1:18332/");
} catch (MalformedURLException e) {
System.err.println(e.getMessage());
return;
}
JSONRPC2Session mySession = new JSONRPC2Session(serverURL);
String method = "getinfo";
int requestID = 0;
JSONRPC2Request request = new JSONRPC2Request(method, requestID);
JSONRPC2Response response = null;
try {
response = mySession.send(request);
} catch (JSONRPC2SessionException e) {
System.err.println(e.getMessage());
return;
}
if (response.indicatesSuccess())
System.out.println(response.getResult());
else
System.out.println(response.getError().getMessage());
}
И ответ, который я получаю:
Invalid JSON-RPC 2.0 response
Просто отметим - при выполнении этого скрипта Python:
access = jsonrpc.ServiceProxy("http://user:pass@127.0.0.1:18332/")
print access.getinfo()
Я получаю должные результаты.
Что может быть причиной этой проблемы и как мне ее исправить?
Как оказалось, библиотека, которую я использую, не любит ответы JSON, содержащие как поле «ошибка», так и «ответ», даже если для поля «ошибка» установлено значение null. Я уже уведомил создателя библиотеки о возможном исправлении этой проблемы, и я также исправил ее сам:
В private Map<String,Object> parseJSONObject(final String jsonString)
функцию нужно добавить это в конце:
Map<String,Object> answer = (Map<String,Object>)json;
if (answer.containsKey("error")){
if (answer.get("error")==null){
answer.remove("error");
}
}
if (answer.containsKey("result")){
if (answer.get("result")==null){
answer.remove("result");
}
}
return answer;
Ник Оделл
Пиачу