首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

PHP 5 呼叫 Java WebService 實戰:SOAP 編碼錯誤與 MTOM 附件解析全解析

     編輯:PHP 相關知識

環境背景

  • 伺服器端:Spring 3.0.5 + CXF 2.4,JDK 1.6(WSDL 自動生成,非我方掌控)
  • 客戶端:PHP 5.1.3

問題一:SOAP-ERROR: Encoding: object has no 'id' property

API 文件聲明不需 id,但 WSDL 定義中 minOccurs 預設為 1,導致 PHP 強制要求該屬性。深入 PHP 原始碼 php_encoding.c 中的 model_to_xml_object 函式,發現當 min_occurs == 0 才會跳過驗證。解決方案:在請求中補入任意 id 值通過驗證(服務端規範不足所致)。

問題二:looks like we got no XML document

抓包發現回應為 multipart/related 格式(MTOM),非純 XML。CXF 啟用 mtom-enabled="true",但 PHP SOAP 擴展預設不支援 MTOM。

解決方案:繼承 SoapClient 重寫 __doRequest

class ZSoapClient extends SoapClient {
    public function __doRequest($request, $location, $action, $version, $one_way = 0) {
        $response = parent::__doRequest($request, $location, $action, $version, $one_way);
        $start = strpos($response, '<soap');
        $end = strrpos($response, '>');
        return substr($response, $start, $end - $start + 1);
    }
}

此法提取純 SOAP 訊息主體,繞過 MTOM 多部件封裝,完美解決解析失敗。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved