Server
Для запуска XMLRPC сервера необходимо инициировать запуск HTTP-сервера и установить обработчик. «/RPC2» — это URL по умолчанию для XMLRPC. Код содержит xmlRpcHandler, обработчик метода и отдельный метод тестирования.
#uses «CtrlHTTP» #uses «CtrlXmlRpc» #uses «xmlrpcHandlerCommon.ctl» #uses «CtrlZlib» int HTTP_PORT = 80; const int HTTPS_PORT = 0; // Чтобы включить HTTPS, установите на 443 main() { //Запуск HTTP-сервера if (httpServer(false, HTTP_PORT, HTTPS_PORT) < 0) { DebugN(«ERROR: HTTP-server can’t start. — Check license»); return; } //Запуск обработчика XmlRpc httpConnect(«xmlrpcHandler», «/RPC2»); } mixed xmlrpcHandler(const mixed content, string user, string ip, dyn_string ds1, dyn_string ds2, int connIdx) { string sMethod, sRet; dyn_mixed daArgs; mixed methodResult; mixed xmlResult; string cookie = httpGetHeader(connIdx, «Cookie»); int ret; dyn_errClass derr; //Декодирование содержания ret = xmlrpcDecodeRequest(content, sMethod, daArgs); derr = getLastError(); if (ret < 0 || dynlen(derr)>=1) { throwError(derr); //Ошибка вывода derr = xmlRpcMakeError(PRIO_SEVERE, ERR_SYSTEM, ERR_PARAMETER, «Error parsing xml-rpc stream», «Method: «+sMethod); throwError(derr); return xmlrpcReturnFault(derr); } //Запуск собственного обработчика methodResult = methodHandlerOwn(sMethod, daArgs, user,cookie); derr = xmlRpcGetErrorFromResult(methodResult); /* Get error from result if error occurred */ if (dynlen(derr) > 0) //Произошла ошибка { throwError(derr); //Возвращает сбой //Ошибка кодирования return makeDynString(xmlrpcReturnFault(derr), «Content-Type: text/xml»); } sRet = xmlrpcReturnSuccess(methodResult); //Encode result //Сжатие результата, если другая сторона это позволяет if ( strlen(sRet) > 1024 && strpos(httpGetHeader(connIdx, «Accept- Encoding»),»gzip») >= 0) { //Возврат сжатого содержимого blob b; gzip(sRet, b); xmlResult = makeDynMixed (b, «Content-Type: text/xml», «Content-Encoding: gzip»); } else { //Возврат основного содержимого xmlResult = makeDynString( sRet, «Content-Type: text/xml»); } return xmlResult; } mixed methodHandlerOwn(string sMethod, dyn_mixed &asValues, string user, string cookie) { switch (sMethod) { case «wccoa.own.testmethod» : return xmlrpc_wccoa_own_testmethod(sMethod, asValues); default : return methodHandlerCommon(sMethod, asValues, user, cookie); } } private mixed xmlrpc_wccoa_own_testmethod(string sMethod, dyn_mixed values) { mixed res; string name; //Проверка параметров if (dynlen(values) >= 2) return xmlRpcMakeError(PRIO_SEVERE, ERR_CONTROL, ERR_INVALID_ARGUMENT, sMethod, «»+values); //Код Magic: name = values[1]; res = «Hello World»+name; return res; } |
Клиент
Пример демонстрирует подключение к серверу, вызов функции на сервере, а также закрытие подключения к серверу:
#uses «CtrlXmlRpc» main() { string id = «servID»; string func = «wccoa.own.testmethod»; dyn_mixed args = makeDynString(«World»);; mixed res; string host = «localhost»; int port = «80»; bool secure = FALSE; xmlrpcClient(); xmlrpcConnectToServer(id, host, port, secure); xmlrpcCall(id, func, args, res); DebugN(«Result of XmlRpc call», res); xmlrpcCloseServer(id); } |