Пример XML-RPC сервера и клиента

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *