参照 http://www.cnblogs.com/codebean/archive/2011/07/27/2118446.html 上面的例子,写了一个xmlrpc for php 的客户端和服务端,然后依葫芦画瓢,修改一些东西,为自所用,但是中间遇到不少问题,纠结、百度、尝试,最后终于解决了。先将遇到的问题及解决方法整理如下,以备忘。
问题1:
例子中调用服务端的问题,因为我服务端,客户端都是在本地,所以出现了在调用的时候,不知道怎么写路径,后来琢磨出来,应该向下面这样:
$client = new xmlrpc_client("testrpc_server//interface.php", "localhost" ,'80')
---- http://localhost:80/testrpc_server//interface.php 就是服务端的地址
问题:2:
参考链接中的例子,拷贝好代码后,遇到一个问题:
php Deprecated: Function split() is deprecated...
原因及解决方法:遇到一个因php版本太高而产生的问题,下载最新的xmlrpc lib包解决问题(下载地址:http://sourceforge.net/projects/phpxmlrpc/)
问题3:
Something went wrong - -32300 : transport error - HTTP status code was not 200
原因及解决方法:
server_url没有配置,所以返回的 HTTP status是 404 ,这里只给出 HTTP status code was not 200,不太易明白,单独调试服务端发现的。
问题4:
xmlrpcresp 返回多维数组的问题
返回结果中是一个struct类型,多个string和一个二维数组,费了好大劲,将这些内容一层层嵌套成一个 xmlrpcval 对象(每个单独的string 和二维数组在同一级别),但是在客户端始终解析不到二维数组,将二维数组转化为一维数组,还是不行,最后,干脆不用数组了,将数组中的内容拆出来,和每个单独的string 值并列,使用
new xmlrpcval(array(str1,str2,.....),"array");
返回一个对象,这样就一样将数据解析出来了。这里有些奇怪,是 xmlrpcresp 不支持多维数组还是 xmlrpcval 不支持多维数组,还是支持,只是我没弄明白?总之,纠结了许久,问题也算解决了。
ps:网上到处找资料时发现 xmlrpcval 的一个非常有用的方法:addScalar() ,可以不断网 xmlrpcval中添加对象(注:添加的对象不需要转成 xmlrpcval,直接保持php的数据类型即可),如:
$msg = new xmlrpcval(array($msg_name,$msg_id,$msg_summary,$msg_point),"array"); // 注:$msg_nam , $msg_id , $msg_summary , $msg_point 都是 xmlrpcval 对象
$msg->addScalar($actions); // $actions 是一个string变量 , 不能是 xmlrpcval 对象,否则会出现xml解析错误。
方法:addArray 的作用相当于是循环将 各个对象用 addScalar加到 xmlrpcval 对象中,更多看:http://phpxmlrpc.sourceforge.net/doc/xmlrpcval.html
XML-RPC for PHP 的文档:http://phpxmlrpc.sourceforge.net/doc/index.html
问题5:
编码问题很头大,一个中文的冒号没看见,导致调试了2个多小时,客户端调服务端就是同不过,报错无法解析xml,但是在服务端单独调用就可以了。最后debug调试,发现返回内容中有乱码问题。于是将所有的输入,都换成单个的英文单词,去掉冒号,空格等字符,结果就调通了,再将删去的内容一点点加上去,发现原来是一个中文冒号费了我2小时。
xml-rpc 中的 new xmlrpcval($val,"string"); 如果 $val 含有中文字符,是会出错的,调用不成功。对于xml-rpc的中文问题解决方法,网上查了一下。开始发现有这样一个思路:将所有的字符串base64编码,然后再传输,接收后再解码。思路好像不错,稍实践了一下,发现这种方法行不同,而且特别麻烦。找到另一种方法解决问题。连接地址如下:http://hi.baidu.com/bjliwei/blog/item/b66f06ec55079c2162d09fa9.html ,例子很简单。试了以后,发现不需要修改 xmrpc.inc中的$GLOBALS['xmlrpc_internalencoding']='ISO-8859-1'; 只要在文件中加上$xmlrpc_internalencoding='UTF-8'; 就可以了,那个全局变量需要修改配置文件,个人觉得还是不修改为好,在文件中写明白更易懂。
总结一下xmlrpc中文编码问题:
客户端调用时,添加 $xmlrpc_internalencoding='UTF-8'; ,然后 用 函数 php_xmlrpc_encode($val); 替换 new xmlrpcval($val,"string"); 就可以了,不知道是不是因为我服务端也是用php实现的,所有对服务端无任何修改。按原样返回内容,在服务端未用 php_xmlrpc_encode函数对变量进行xml格式转换。