首頁  >  文章  >  後端開發  >  PHP5 在呼叫 JAVA WebService 時遇到的各種問題解決方法_PHP教學課程

PHP5 在呼叫 JAVA WebService 時遇到的各種問題解決方法_PHP教學課程

WBOY
WBOY原創
2016-07-22 09:02:47811瀏覽

 開始gank。

服務端:

Spring3.0.5 CXF2.4,JDK1.6

「應該是」自動產生的wsdl檔案

客戶端:

PHP5.1.3

碰見的第一個問題:

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

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

查閱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);//明顯就是它!
}
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=""; startac. -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:
20032012-12-04 15:57:46.124Logic errorsfn004.cn :瀵逛笉璧鳳紝姝ゅ煙鍚嶁€滃彲淇$綉綺欌€濋獙璇佹湇鍔$敵璇愜摷瑩獔獔鍔岋紒zhjx922.com:瀵逛笉璧鳳紝姝ゅ煙鍚嶁€滃儻縹綉縹縹縹緌帹縹緌帹縹巒€維德濋獙璇佹湇鍔$敵璇鋒鍦ㄥ鏍鐙腑錛儷笉鑳藉啀嬈℃敞鐓岋紒 /soap:Envelope>
--uuid:0c37c356-41de-4361-9835-ab8dc023dcac--
明顯不是XML。 。所以PHP老大就報錯了

 

詢問對方,答覆是:

CXF設定如下上傳屬性,關鍵點就是MTOM,PHP SOAP擴充預設是乎不支援這個玩意



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);

//依實際情況做處理。 。 。 ,如果是 $start=strpos($response,' $end=strrpos($response,'>');
$response_string=substr($response,$start,$end-$start 1);
return($response_string);
}
}

www.bkjia.comtruehttp: //www.bkjia.com/PHPjc/37186​​3.htmlTechArticle開始gank。 服務端: Spring3.0.5 CXF2.4,JDK1.6 應該是自動產生的wsdl檔案服務端不是我們的客戶端: PHP5.1.3 碰見的第一個問題: SOAP-ERROR: Enco...
陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn