xmlrpc for php 遇到的問題及解決方法

 

參照 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格式轉換。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章