xml-rpc 简单案例

作者: jaclon 分类: PHP 发布时间: 2011-05-11 14:27 ė 61条评论

关于XML-RPC

XML-RPC的全称是XML Remote Procedure Call,即XML远程方法调用。  它是一套允许运行在不同操作系统、不同环境的程序实现基于Internet过程调用的规范和一系列的实现。  这种远程过程调用使用http作为传输协议,XML作为传送信息的编码格式。Xml-Rpc的定义尽可能的保持了简单,但同时能够传送、处理、返回复杂的数据结构。  XML-RPC是工作在Internet上的远程过程调用协议。一个XML-RPC消息就是一个请求体为xml的http-post请求,被调用的方法在服务器端执行并将执行结果以xml格式编码后返回。

构造服务器端

/**
 * 服务器端方法
 * 
 * @param string $method  调用哪个方法
 * @param string $params  参数
 */
function rpc_server_func($method, $params)
{
	$parameter = $params[0];
	if ($parameter == 'get')
	{
		$return = array('name' => $method, 'age' => 'The second data');
	}
	else
	{
		$return = 'Not specify method or params';
	}

	return $return;
}

// 创建一个 xmlrpc 服务端
$xmlrpc_server = xmlrpc_server_create();

// 注册一个 PHP 函数用于匹配 xmlrpc 方法名,注册rpc_server方法,并指向rpc_server_func函数
xmlrpc_server_register_method($xmlrpc_server, "rpc_server", "rpc_server_func");

// 获取post过来的数据
$request = $HTTP_RAW_POST_DATA;

// 解析 XML 请求同时调用方法
$xmlrpc_response = xmlrpc_server_call_method($xmlrpc_server, $request, null);

// 以XML形式发送结果数据
header('Content-Type: text/xml');
echo $xmlrpc_response;

// 销毁服务端资源
xmlrpc_server_destroy($xmlrpc_server);

构造客户端

 
/**
 * 调用远程方法
 * 创建一个socket请求,然后发送请求参数,最后接收并返回数据
 * @param string $host
 * @param int $port
 * @param string $rpc_server
 * @param string $request
 * @return string
 */
function rpc_client_call($host, $port, $rpc_server, $request)
{
	$fp = fsockopen($host, $port);

	$query = "POST $rpc_server HTTP/1.0\nUser_Agent: XML-RPC 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 false;
	}

	$contents = '';
	while ( ! feof($fp))
	{
		$contents .= fgets($fp);
	}

	fclose($fp);

	return $contents;
}

// 主机
$host = '127.0.0.1';
// 端口
$port = 80;
// 请求页面
$rpc_server = '/test/rpc_server.php';
// 将请求方法和参数生成XML
$request = xmlrpc_encode_request('rpc_server', 'get');
// 发送请求,并接收返回的数据
$response = rpc_client_call($host, $port, $rpc_server, $request);

// 从返回的html中分离出XML数据
$split = "\r\n\r\n";
$xml = explode($split, $response);
$xml = array_pop($xml);
// 将 XML 译码为 PHP 本身的类型
$response = xmlrpc_decode($xml);

// 打印数据
print_r($response);

打印结果

Array
(
    [name] => rpc_server
    [age] => The second data
)

本文出自 肥蕉博客@IT技术,热门话题,生活随笔,美图欣赏,转载时请注明出处及相应链接。

本文永久链接: http://www.bananawolf.com/html/2011/05/505.html

一条评论

  1. satsun 五月 15, 2011 3:43 下午 回复

    DOJOCN.ORG 欢迎您的支持 去看看 无妨 呵呵

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*

Ɣ回顶部