2010-02-25 6 views
1

Comment puis-je transmettre un tableau en tant que valeur dans une requête soapclient PHP?Comment puis-je transmettre un tableau en tant que valeur dans une requête soapclient PHP?

J'ai un soapclient instancié et déjà connecté. J'essaye alors de faire un appel à une méthode webservice qui attend 3 paramètres (string, string, hashmap).

Voici ce que je m'attendais à travailler ci-dessous. Mais lors de l'affichage de la sortie xml, le nœud params est vide.

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

xml corps de savon se termine comme ça (notez l'élément params vide):

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

Répondre

0

Selon la définition de webservice, le paramètre hashmap pourrait avoir besoin d'avoir une structure/codage spécifique qui peut ne pas être directement créé à partir d'un tableau. Vous pourriez vouloir vérifier le WSDL là-dessus, et jetez un oeil dans les classes SoapVar et SoapParam pour plus d'options sur la construction de paramètre de savon.

2

Pour les services Web JAX-WS, le paramètre d'entrée hashmap peut poser un problème. Le schéma xsd généré semble incorrect pour les hashmaps. En plaçant la carte dans un objet wrapper, JAX-WS génère le fichier xsd correct.

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 
} 

Ensuite, le code PHP réussira. J'ai trouvé que je n'avais pas besoin de SoapVar ou de SoapParam et que je ne pouvais obtenir aucune de ces méthodes sans le MapWrapper.

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

Voici le xsd correct généré avec l'emballage

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

Voici le schéma incorrect généré par JAX-WS avec juste le 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> 

Une note dernière. Wrapping HashMap < chaîne, chaîne > travaillé avec cette solution, mais HashMap < chaîne, objet > n'a pas. L'objet est mappé à xsd: anyType qui entre dans le service Web Java en tant qu'objet de schéma xsd plutôt que simplement en tant qu'objet.

Questions connexes