標籤:php java webservice 介面 命名空間 不能傳參
前言:
剛剛做了一個事,php調java的soap介面,但是並沒有什麼文檔,只有看以前寫的java調用用來寫。所以java是可以正常調用的,出現的問題是php能調到介面,但是接收不了參數。
開始沒看懂那個java調用,設定targetNamespace是什麼鬼,翻遍了php手冊,吧英文翻譯過來看了才知道,SoapVar對應了soap資料的封裝。
網上收了,發現他們都在亂答。浪費我時間,還不如自己看手冊。
問題出在:命名空間
java soapClient:
/** * saleOrderInfo 為參數‘{"order":"00122211111","date":"2017-04-14","customer_id":"027"}‘; */public String callWebService(String saleOrderInfo) throws ServiceException, RemoteException{// webservice路徑 // 這裡後面加不加 "?wsdl" 效果都一樣的 String endpoint = "http://127.0.0.1/service?wsdl"; // 傳送簡訊介面方法名 String operationName = "sendSaleOrder"; String targetNamespace = "http://service.test.bb.service/"; // 定義service對象 org.apache.axis.client.Service service = new org.apache.axis.client.Service(); // 建立一個call對象 Call call = (Call) service.createCall(); // 設定目標地址,即webservice路徑 call.setTargetEndpointAddress(endpoint); call.setOperationName(new QName(targetNamespace, operationName)); call.addParameter(new QName("http://test.bb.service/", "saleOrderInfo"), XMLType.XSD_STRING, ParameterMode.IN); call.setReturnClass(String.class); // 解決錯誤:伺服器未能識別 HTTP 頭 SOAPAction 的值 call.setUseSOAPAction(true); call.setSOAPActionURI(""); Object obj = call.invoke(new Object[]{saleOrderInfo}); String result = ObjectUtils.toString(obj); if(StringUtils.isBlank(result)){ result = "{\"message\":\"介面返回結果為空白!\",\"retCode\":\"0\"}"; } return result;}
開始錯誤的php調用方式 soapClient:
<?php//指定WebService路徑並初始化一個WebService用戶端$ws = "http://127.0.0.1/service?wsdl";//webservice服務的地址$client = new SoapClient ($ws);//參數$params = ‘{"order":"00122211111","date":"2017-04-14","customer_id":"027"}‘;$result=$client->sendSaleOrder([saleOrderInfo => $params]);echo "<pre>";print_r($result);//顯示結果//調用成功,但是參數接收不到
正確的php調用方式 soapClient:
<?php//指定WebService路徑並初始化一個WebService用戶端$ws = "http://127.0.0.1/service?wsdl";//webservice服務的地址$client = new SoapClient ($ws);//參數$params = ‘{"order":"00122211111","date":"2017-04-14","customer_id":"027"}‘;$wrapper = new StdClass;$wrapper->saleOrderInfo = new SoapVar($params, XSD_STRING, "string", "http://test.bb.service/", "saleOrderInfo", "http://test.bb.service/");$searchrequest = new SoapParam($wrapper, "sendSaleOrder");$result=$client->sendSaleOrder($searchrequest);echo "<pre>";print_r($result);//顯示結果//調用成功
後言:
是的,如你所見。問題就是出在命名空間,service端設定了方法和參數的命名空間,然而方法的命名空間service端設定了預設的地址,所以調用的時候設定了參數的命名空間就能傳參了。
SoapVar是php開放的主要用來封裝用於放入 SOAP 請求中的資料,包括命名方式。
本文出自 “Shows technology” 部落格,請務必保留此出處http://wangzhijun.blog.51cto.com/9660708/1916427
php調用java寫的WebService不能傳參問題解決