前言:
剛剛做了一個事,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 請求中的數據,包括命名方式。