程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> PHP5 在調用 JAVA WebService 時遇到的各種問題解決方法

PHP5 在調用 JAVA WebService 時遇到的各種問題解決方法

編輯:關於PHP編程

     開始gank。

    服務端:

    Spring3.0.5+CXF2.4,JDK1.6

    “應該是”自動生成的wsdl文件<服務端不是我們的>

    客戶端:

    PHP5.1.3

    碰見的第一個問題:

    SOAP-ERROR: Encoding: object has no 'id' property

    但是API文檔上說不需要id,查看wsdl文件內容

    <xs:complexType name="seal"><xs:sequence><xs:element name="id" type="xs:long"/><xs:element minOccurs="0" name="name" type="xs:long"/>

    查閱schema文檔,有如下內容:

    通過 schema,我們可使用 maxOccurs 和 minOccurs 屬性來定義某個元素可能出現的次數。maxOccurs 定義某元素出現次數的最大值,而 minOccurs 則定義某元素出現次數的最小值。maxOccurs 和 minOccurs 的默認值都是 1!(好吧,這個是服務端的問題?然後自己隨便寫了個值,通過了。。。)


    PS:中間有個小環節,我盡然去看了PHP的源代碼。。。

    SOAP中的php_encoding.c裡面的函數 model_to_xml_object

    static int model_to_xml_object(xmlNodePtr node, sdlContentModelPtr model, zval *object, int style, int strict TSRMLS_DC)

    //一小段代碼


    } else if (model->min_occurs == 0) {
    return 2;
    } else {
    if (strict) {
    soap_error1(E_ERROR, "Encoding: object has no '%s' property", model->u.element->name);//明顯就是<span style="font-family:Times New Roman;">它!</span>
    }
    return 0;
    }

    我是從這裡發現問題出現在min_occurs上,所以才解決了上面問題(是不是對方不太規范?)


    第二個問題:

    looks like we got no XML document

    這個可是郁悶了,解決了好久

    已經返回來數據了,然後我抓包(貌似有方法可以直接顯示數據),發現返回的數據類似如下格式:


    HTTP/1.1 200 OK
    Server: Apache-Coyote/1.1
    Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:0c37c356-41de-4361-9835-ab8dc023dcac"; start="<[email protected]>"; start-info="text/xml"
    Content-Length: 790
    Date: Tue, 04 Dec 2012 07:57:45 GMT


    --uuid:0c37c356-41de-4361-9835-ab8dc023dcac
    Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
    Content-Transfer-Encoding: binary
    Content-ID: <[email protected]>
    <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"><soap:Body><ns2:createSealResponse xmlns:ns2="http://service.api.seal.kx.knet.cn/"><return><code>2003</code><date>2012-12-04 15:57:46.124</date><msg>Logic error</msg><result>sfn004.cn:瀵逛笉璧鳳紝姝ゅ煙鍚嶁€滃彲淇$綉绔欌€濋獙璇佹湇鍔$敵璇鋒鍦ㄥ鏍鎬腑锛屼笉鑳藉啀娆℃敞鍐岋紒</result><result><span style="font-family:Times New Roman;">zhjx922.com</span>:瀵逛笉璧鳳紝姝ゅ煙鍚嶁€滃彲淇$綉绔欌€濋獙璇佹湇鍔$敵璇鋒鍦ㄥ鏍鎬腑锛屼笉鑳藉啀娆℃敞鍐岋紒</result></return></ns2:createSealResponse></soap:Body></soap:Envelope>
    --uuid:0c37c356-41de-4361-9835-ab8dc023dcac--
    明顯不是XML。。所以PHP老大就報錯了

     

    詢問對方,答復是:

    CXF設置了如下上傳屬性,關鍵點就是MTOM,PHP SOAP擴展默認是乎不支持這個玩意

    <jaxws:properties>
    <entry key="mtom-enabled" value="true" />
    </jaxws:properties>

    baidu,google 可以通過WSO2 WSF FOR PHP 擴展實現,嫌棄麻煩繼續找。。。

    看了一下官方文檔介紹

    http://cn2.php.net/soap

    有條回復幫我解決了,最終解決方法如下:

    /**
    * 繼承SoapClient類,重寫__doRequest方法
    * @author zhjx922
    */
    class ZSoapClient extends SoapClient
    {
    public function __doRequest($request, $location, $action, $version, $one_way = 0)
    {
    $response = parent::__doRequest($request, $location, $action, $version, $one_way);

    //根據實際情況做處理。。。,如果是<?xml開頭,改成<?xml
    $start=strpos($response,'<soap');
    $end=strrpos($response,'>');
    $response_string=substr($response,$start,$end-$start+1);
    return($response_string);
    }
    }

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved