android-json-rpc, получение неверного ответа

#android #json #json-rpc

#Android #json #json-rpc

Вопрос:

Я пытаюсь получить ответы от службы JSON-RPC на Android, в настоящее время я разрабатываю версию 3.0 Honeycomb.

Это библиотека, которую я использую: http://code.google.com/p/android-json-rpc /

и я использую эту страницу службы JSON-RPC для тестирования: http://www.raboof.com/projects/jayrock/demo.ashx

Соединение, похоже, работает, но я продолжаю получать это исключение

 org.alexd.jsonrpc.JSONRPCException: Invalid JSON response
 

Я пробовал разные методы и страницы опроса, но я всегда получаю одно и то же исключение. Где я ошибаюсь?

Соответствующий код приведен ниже. Используется AsyncTask, поскольку начиная с версии 3.0 Android не разрешает сетевые подключения в основном потоке. Заранее спасибо.

  @Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);

    JSONHandler task = new JSONHandler();
    task.execute(new String[] {"http://www.raboof.com/projects/jayrock/demo.ashx"});    
}

private class JSONHandler extends AsyncTask<String, Void, String> {

    @Override
    protected String doInBackground(String... urls) {
        for (String url : urls) {
            JSONRPCClient client = JSONRPCClient.create(url);
            client.setConnectionTimeout(2000);
            client.setSoTimeout(2000);

            try {
                client.call("counter");
            } catch (JSONRPCException e) {
                e.printStackTrace(); //Invalid JSON Response caught here
            }
        }
        return null;
    }
}
 

Ответ №1:

Я протестировал вашу систему, используя последнюю версию библиотеки. Это отлично работает. Вам нужно позвонить нам («счетчик»), и все будет в порядке.

Вот код, который я использовал:

 public JSONRPCClient client = JSONRPCClient.create("http://www.raboof.com/projects/jayrock/demo.ashx", JSONRPCClient.Versions.VERSION_2);
try{
    int resInt = client.callInt("counter");
} catch (JSONException e) {
    Log.i("JSON-RPC Client", e.toString());
}
 

Я надеюсь, что это может помочь.

PS: в этой новой версии вы используете отправку параметров в виде массива или с помощью JSONObject для отправки именованных параметров. Это возможно только при использовании версии 2.0 протокола JSON-RPC.

Ответ №2:

Это единственный клиент JSON-RPC, который я смог заставить работать с Zend_Json_Server на Android (и я попробовал несколько).

Убедитесь, что также установлена версия 2.0, поскольку этот клиент не работает, если ваш сервер явно не использует спецификацию 2.0:

     $server = new Zend_Json_Server();
    $server->setClass('My_Class');
    $server->getRequest()->setVersion("2.0");
    if ('GET' == $_SERVER['REQUEST_METHOD']) {
        // Indicate the URL endpoint, and the JSON-RPC version used:
        $server->setTarget('/ajax.php')
               ->setEnvelope(Zend_Json_Server_Smd::ENV_JSONRPC_2);

        // Grab the SMD
        $smd = $server->getServiceMap();

        // Return the SMD to the client
        header('Content-Type: application/json');
        echo $smd;
        return;
    }

$server->handle();