2010-02-25 58 views
1

如何將數組作爲值傳入PHP soapclient請求中?如何將數組作爲值傳入PHP soapclient請求?

我有一個soapclient已經實例化和連接。然後我嘗試調用一個需要3個參數(string,string,hashmap)的webservice方法。

這是我期望在下面的工作。但是當查看xml輸出時,params節點是空的。

soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 'params' => array('email' => '[email protected]', 'password' => 'password', 'blah' => 'blah'))); 

SOAP主體XML這樣結束了(注意空params元素):

<SOAP-ENV:Body><ns1:doSomething> 
<id>blah</id> 
<page>blah</page> 
<params/> 
</ns1:register></SOAP-ENV:Body> 

回答

0

根據Web服務定義,HashMap的參數可能需要具有特定結構/編碼能不能直接從數組創建。您可能想要檢查WSDL,並查看SoapVarSoapParam類,以獲取有關Soap參數構造的更多選項。

2

對於JAX-WS webservices,它可能是散列表輸入參數的問題。生成的xsd模式似乎對hashmaps不正確。將映射放置在包裝器對象中會導致JAX-WS輸出正確的xsd。

public class MapWrapper { 
    public HashMap<String, String> map; 
} 


// in your web service class 
@WebMethod(operationName = "doSomething") 
public SomeResponseObject doSomething(
     @WebParam(name = "id") String id, 
     @WebParam(name = "page") String page, 
     @WebParam(name = "params") MapWrapper params { 
    // body of method 
} 

然後php代碼就會成功。我發現我不需要SoapVar或SoapParam,並且無法使這兩種方法在沒有MapWrapper的情況下工作。

$entry1['key'] = 'somekey'; 
$entry1['value'] = 1; 
$params['map'] = array($entry1); 
soapclient->doSomething(array('id' => 'blah', 'page' => 'blah', 
    'params' => $params)); 

這裏是與包裝物

<xs:complexType name="mapWrapper"> 
    <xs:sequence> 
    <xs:element name="map"> 
     <xs:complexType> 
     <xs:sequence> 
      <xs:element name="entry" minOccurs="0" maxOccurs="unbounded"> 
      <xs:complexType> 
       <xs:sequence> 
       <xs:element name="key" minOccurs="0" type="xs:string"/> 
       <xs:element name="value" minOccurs="0" type="xs:string"/> 
       </xs:sequence> 
      </xs:complexType> 
      </xs:element> 
     </xs:sequence> 
     </xs:complexType> 
    </xs:element> 
    </xs:sequence> 
</xs:complexType> 

生成正確的XSD這裏是JAX-WS只HashMap的最後

<xs:complexType name="hashMap"> 
    <xs:complexContent> 
    <xs:extension base="tns:abstractMap"> 
     <xs:sequence/> 
    </xs:extension> 
    </xs:complexContent> 
</xs:complexType> 
<xs:complexType name="abstractMap" abstract="true"> 
    <xs:sequence/> 
</xs:complexType> 

一個音符所產生的不正確的架構。包裝HashMap <字符串,字符串>與此解決方案一起工作,但HashMap <字符串,對象>沒有。 Object被映射爲xsd:anyType,它作爲xsd模式對象而不是Object來進入java webservice。