سؤال

I am trying to get responses from a JSON-RPC Service on Android, I'm currently developing on 3.0 Honeycomb.

This is the library I am using: http://code.google.com/p/android-json-rpc/

and I am using this JSON-RPC service page for testing: http://www.raboof.com/projects/jayrock/demo.ashx

The connection seems to work, but I keep getting this Exception

org.alexd.jsonrpc.JSONRPCException: Invalid JSON response

I've tried different methods and survey pages, but I always get the same Exception. Where am I going wrong?

The relevant code is below. AsyncTask is used because since 3.0 Android doesn't allow network connections in the main stream. Thanks in advance.

 @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;
    }
}
هل كانت مفيدة؟

المحلول

I have tested your system using the last version of the library. It work great. You need to us callInt("counter") and it will be ok.

There is the code I used:

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());
}

I hope this can help.

PS: with this new version, you use parameters send as an array, or using a JSONObject to send named parameters. This is only possible if using the version 2.0 of the JSON-RPC protocol.

نصائح أخرى

This is the only JSON-RPC client I've been able to get to work with Zend_Json_Server on Android (and I've tried a few).

Make sure to set the version to 2.0 also, as this client doesn't work unless your server is explicitly using the 2.0 spec:

    $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();
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top