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 請求中的數據,包括命名方式。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章