Starting from Sippy 4.4 it's possible to use MULTICALL in XMLAPI.

This feature allows to "pack" N XMLAPI call into a single request to send to Server, instead of sending them one by one.


Measured benchmark for the addDID() xmlapi call showed 3 times faster execution in multicall compared with regular one-by-one addition of 1000 DIDs:

- 5m 20s in regular modeĀ 

- 1m 39s in multicall.


PYTHON example:

import httplib2
import urllib
from xmlrpclib import ServerProxy, getparser, ProtocolError, MultiCall

class HTTPSDigestAuthTransport:
    def request(self, host, handler, request_body, verbose=0):
        auth, host = urllib.splituser(host)
        username, password = urllib.splitpasswd(auth)
        h = httplib2.Http(disable_ssl_certificate_validation=True)
        if verbose:
            h.debuglevel = 1
        h.add_credentials(username, password)
        resp, content = h.request("https://" + host + handler, "POST", body=request_body,
                                  headers={'content-type':'text/xml'})
        if resp.status != 200:
            raise ProtocolError("https://" + host + handler,
                                resp.status, resp.reason, None)
        p, u = getparser(0)
        p.feed(content)
        return u.close()

transport = HTTPSDigestAuthTransport()
client = ServerProxy("https://username:password@1.2.3.4/xmlapi/xmlapi", transport)
multicall = MultiCall(client)
multicall.getAccountCallStats({ "i_account" : 1})
multicall.getAccountCallStats({ "i_account" : 1})
multicall.getAccountInfo({ "i_account" : -1}) # expect error here
multicall.getAccountCallStats({ "i_account" : 1})

for res in multicall().results:
    if isinstance(res, dict):
        print "Fault", res
    else:
        print res[0]


PHP example:

<?
set_include_path(get_include_path() . PATH_SEPARATOR . '/home/ssp/sippy_web/lib');

include 'xmlrpc/xmlrpc.inc';

$customer_web_login    = "username";
$customer_api_password = "password";

$params = array(new xmlrpcval(array(
        "i_environment" => new xmlrpcval('1', "int"),
    ), 'struct'));
$msg = new xmlrpcmsg('getAccountCallStats', $params);

$params2 = array(new xmlrpcval(array(
        "i_account" => new xmlrpcval('-1', "int"), // expect error
    ), 'struct'));
$msg2 = new xmlrpcmsg('getAccountInfo', $params2);

$cli = new xmlrpc_client('https://1.2.3.4/xmlapi/xmlapi');
$cli->request_charset_encoding = 'UTF-8';
$cli->setSSLVerifyPeer(false);
$cli->return_type = 'phpvals';
$cli->setDebug(2);

//$cli->setCredentials($customer_web_login, $customer_api_password, CURLAUTH_DIGEST);

$r = $cli->multicall(Array($msg, $msg, $msg2, $msg), 10, '', FALSE);

print_r($r);
?>