您的位置:首页 > Web前端 > JavaScript

客户端通过 JSON直接调用服务器的函数。

2009-03-10 14:40 399 查看
客户端发送的JSON格式:

{
proc: 子程序名
params: {....}
}


 服务端的的代码:

<?php
$static_rpc_entrys = array();

class javaFunc{
private $str = null;
function __construct($vstr){
$this->str = $vstr;
}
function getStr(){
return $this->str;
}
}

function __array2j(&$arr)
{
$str='';
$first=true;
$is_obj=true;
foreach($arr as $key=>$value){
if($first){
$is_obj = !is_int($key);
$first=false;
$str=$is_obj?'{':'[';
}else{
$str.=',';
}
$t=gettype($value);
if($is_obj)
{
switch($t)
{
case 'boolean':
$str.='"'.$key.'":'.$value?'true':'false';break;
case 'NULL':
$str.='"'.$key.'":null';break;
case 'double':
case 'float':
case 'integer':
$str.='"'.$key.'":'.$value;break;
case 'string':
$str.='"'.$key.'":"'.__STRVAL($value).'"';break;
case 'array':
$str.='"'.$key.'":'.__array2j($value);break;
case 'object':
if('javaFunc' == get_class($value)){
$str.='"'.$key.'":'.$value->getStr();
}else{
$object_arr = get_object_vars($value);
$str.='"'.$key.'":'.__array2j($object_arr);
}
break;
}
}else{
switch($t)
{
case 'boolean':
$str.=$value?'true':'false';break;
case 'NULL':
$str.='null';break;
case 'double':
case 'float':
case 'integer':
$str.=$value;break;
case 'string':
$str.='"'.__STRVAL($value).'"';break;
case 'array':
$str.=__array2j($value);break;
case 'object':
if('javaFunc' == get_class($value)){
$str.='"'.$key.'":'.$value->getStr();
}else{
$object_arr = get_object_vars($value);
$str.='"'.$key.'":'.__array2j($object_arr);
}
break;
}
}
}
if($first==false)
return $str.($is_obj?'}':"]");
return '[]';
}

function Array2Json(&$arr)
{
$t=gettype($arr);
switch($t){
case 'array':
return __array2j($arr);break;
case 'object':
if('javaFunc' == get_class($value)){
return $value->getStr();
}else{
$object_arr = get_object_vars($value);
return __array2j($object_arr);
}
break;
default:
return $arr;
}
}
function __STRVAL($htmlStr){
$search = array (
"'/"'",
"'//''",
"'/r'",
"'/n'");

$replace = array (
'//"',
'//'.chr(39),
"//r",
"//n"
);
return preg_replace($search,$replace,$htmlStr);
}

function JSONRPC_REGISTER($func_name,$func){
global $static_rpc_entrys;
$static_rpc_entrys[$func_name]=$func;
}

/**
*  对对象内的文本成员进行编码转换
* @return null
* @param object $arr object|array
*/
function _JSONRPC_SET_ENCODE(&$arr)
{
foreach($arr as $key=>$val){
$t=gettype($val);
switch($t)
{
case 'string':
$arr->$key=iconv('UTF-8','GB2312',$val);
break;
case 'array':
case 'object':
_JSONRPC_SET_ENCODE($arr->$key);
break;
};
}
}
/**
* 对传递进来的变量进行转义处理,使其能安全用于查询语句中。
* @return null
* @param object $arr
*/
function SONRPC_DBSAVE(&$arr){
if(get_magic_quotes_gpc())
return;
foreach($arr as $key=>$val){
$t=gettype($val);
switch($t)
{
case 'string':
$arr->$key=addslashes($val);
break;
case 'array':
case 'object':
__JSONRPC_DBSAVE($arr->$key);
break;
};
}
}
/**
* 根据客户端发送的json执行相应的Function。
* @return
*/
function JSONRPC_CALL()
{
global $static_rpc_entrys;
if($_SERVER['REQUEST_METHOD']=='POST'){
header("Content-type: application/json; charset=gb2312");

$json_rpc=json_decode($GLOBALS['HTTP_RAW_POST_DATA']);
if(is_string($json_rpc))
{
$json_rpc=new stdClass();
foreach($_POST as $key=>$value){
$json_rpc->$key=$value;
}
}

if(isset($json_rpc->proc) && array_key_exists($json_rpc->proc,$static_rpc_entrys)){
_JSONRPC_SET_ENCODE($json_rpc);

if(isset($json_rpc->params))
$retAction = $static_rpc_entrys[$json_rpc->proc]($json_rpc->params);
else{
$retAction = $static_rpc_entrys[$json_rpc->proc]();
}

if(is_array($retAction))
echo Array2Json($retAction);
elseif(is_null($retAction))
echo '{}';
else
echo $retAction;
}else{
echo '{}';
}
}
}

?>


 

用法:

require_once('json_rpc.php');

function login_check(&$arr)
{
return array("msg"=>"你真的很酷!");
}

JSONRPC_REGISTER('brandnew.user.logincheck', "login_check");
JSONRPC_CALL();
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐