客户端通过 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();
相关文章推荐
- 客户应用程序调用COM API CoFreeUnusedLibraries()时,COM库遍历这个客户端应用已加载所有的DLL服务器并通过调用它的DllCanUnloadNow()函数查询每一个服务器
- Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程
- Java的Servlet调用服务器上的html文件直接在客户端打开
- 给MySQL增加mysql-udf-http和mysql-udf-json自定义函数,让MySQL有调用http接口和查询直接回JSON的能力
- 直接客户端浏览器下载文件,不必通过回传服务器再下载(例如将table内容导出excel)
- Android 客户端通过内置API(HttpClient) 访问 服务器(用Spring MVC 架构) 返回的json数据全过程
- MFC 添加C++类,别的类不通过C++类的定义的对象就可以直接调用C++类里面的成员函数;
- C#(服务器)与Java(客户端)通过Socket传递对象(序列化 json)
- 如何通过Java的Web服务器把DataSet或DataTable数据通过json格式传回给C#的客户端
- 下载(二)客户端通过C# 代码直接从服务器下载文件到本地
- 客户端与服务器段的交互 通过json
- GCDAsyncSocket不通过服务器进行客户端间直接连接—iOS移动开发
- 微信相关 -- 可以通过调用下面的方法 请求对应的url 获取微信服务器返回的json数据
- PHPCMS通过getJSON调用的地址回调函数一直无法执行
- 客户端通过C# 代码直接从服务器下载文件到本地
- 项目经验:在调用LotusScript Arrayunique 函数时会导致Domino 服务器或Notes 客户端宕机
- android客户端与服务器交互数据(基于SAOP协议的远程调用标准,通过webservice可以将不同操作系统平台,不同语言,不同技术整合)
- 客户端与服务器通过gson解析json数据
- 下载(二)客户端通过C# 代码直接从服务器下载文件到本地
- 项目经验:在调用LotusScript Arrayunique 函数时会导致Domino 服务器或Notes 客户端宕机