分享
 
 
 

php5中XML-RPC函数的使用

王朝php·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

这几天在看了zend php5 code contest的比赛获奖作品,看了几个的关于web架构方面的获奖作品,感受颇深,xml和php结合应用越来多了,里面几乎所有的作品在设计上都用到了xml这个东西.....-_-! 又落伍了不少. 建议朋友们都去看看. 所以自己这几天在疯狂的学习php和xml结合的相关知识.

这其中就遇到了XML-RPC服务, 在网上可以找到的资料不多, 而且大多数都是用了其他第三方用php开发的XML-RPC class, 而用php5自带的xmlrpc函数(目前是试验模块)的好像就不多了, 但是个人还是比较喜欢原生的东西,就自己研究了一下.

在手册中有人提供了一个例子,但是不支持中文, 并且没有告诉在客户端返回结果后怎么处理这个结果. 自己苦搞半天终于搞明白了,其实可以很轻松让他支持中文, 并且几乎不需要做任何额外的工作.

下面是他原来的例子(可以在手册中找到):

/* clienttest.php */

<?php

function do_call($host, $port, $request) {

$fp = fsockopen($host, $port, $errno, $errstr);

$query = "POST /servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!fputs($fp, $query, strlen($query))) {

$errstr = "Write error";

return 0;

}

$contents = '';

while (!feof($fp)) {

$contents .= fgets($fp);

}

fclose($fp);

return $contents;

}

$host = 'localhost';

$port = 80;

$request = xmlrpc_encode_request('cycle', 'egg');

$response = do_call($host, $port, $request);

/* do something with $response, e.g. print it */

?>

/* servertest.php */

<?php

function lifecycle($method, $params) {

/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */

switch($params[0]) {

case 'egg':

$reply = 'All eggs will be birds one day.';

break;

default:

$reply = 'That must have been an otheregg';

}

return $reply;

}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */

xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'. There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */

$response = xmlrpc_server_call_method($server, $request, null);

header('Content-Type: text/xml');

print $response;

xmlrpc_server_destroy($server);

?>

这个例子中客户端得到$response后没有作任何的处理,这个返回值是这个样子的字符串:

HTTP/1.1 200 OK

Date: Thu, 04 Nov 2004 08:21:43 GMT

Server: Apache/2.0.47 (Win32) PHP/5.0.1

X-Powered-By: PHP/5.0.1

Connection: close

Content-Type: text/xml;charset=GB2312

<?xml version="1.0" encoding="iso-8859-1"?>

<methodResponse>

<params>

<param>

<value>

<string>All eggs will be birds one day.</string>

</value>

</param>

</params>

</methodResponse>

这个字符串包含了两个部分,一个是html的头信息,一个是xml-rpc包文件,对他稍微进行一下处理就可以满足我们的要求了.

下面看看我修改过的例子,主要用了一个xmlrpc_decode函数,网上没有找到说明,自己试了半天,才试出来他的用法:

/* clienttest.php */

<?php

function do_call($host, $port, $request) {

$fp = fsockopen($host, $port, $errno, $errstr);

$query = "POST /servertest.php HTTP/1.0\nUser_Agent: My Egg Client\nHost: ".$host."\nContent-Type: text/xml\nContent-Length: ".strlen($request)."\n\n".$request."\n";

if (!fputs($fp, $query, strlen($query))) {

$errstr = "Write error";

return 0;

}

$contents = '';

while (!feof($fp)) {

$contents .= fgets($fp);

}

fclose($fp);

return $contents;

}

$host = 'localhost';

$port = 80;

$request = xmlrpc_encode_request('cycle', 'egg');

$response = do_call($host, $port, $request);

/* do something with $response, e.g. print it */

$pos = strpos($response, '<?xml');

$str = substr($response, $pos);

$tmp = xmlrpc_decode($str);

print_r($tmp);

/* do something with $tmp e.g. print it */

?>

/* servertest.php */

<?php

function lifecycle($method, $params) {

/* $method = 'cycle', $params = (array of) request parameter(s); $data is also passed from xmlrpc_server_call_method, if we had any data to pass */

switch($params[0]) {

case 'egg':

$reply[] = 'All eggs will be birds one day.我市好人';

$reply[] = 'All eggs will be birds one day.我市好人aaaaa';

break;

default:

$reply[] = 'That must have been an otheregg我市好人';

}

return $reply;

}

$server = xmlrpc_server_create();

/* register the 'external' name and then the 'internal' name */

xmlrpc_server_register_method($server, "cycle", "lifecycle");

$request = $HTTP_RAW_POST_DATA; // no you don't need 'always on', and no $_POST doesn't work.

/* the parameters here are 'server, xml-string and user data'. There's supposed to be an optional 'output options' array too, but I can't get it working :( hence header() call */

$response = xmlrpc_server_call_method($server, $request, null);

header('Content-Type: text/xml');

print ($response);

xmlrpc_server_destroy($server);

?>

运行一下,看看显示的数组的样式,这样处理起来就舒服多了.

明白了这个,别闲着,看看php5自带的"SOAP Functions",使用方法和工作原理,大同小异啊.

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有