2009-07-15 10 views
6

Ambiente:Come creare arrayType per WSDL in Python (usando suds)?

  • Python v2.6.2
  • schiuma v0.3.7

Il WSDL (server) con cui lavoro, hanno le sottosezioni seguente schema (ho provato a scrivere chiaramente utilizzando testo in chiaro) -


[sub-se ction # 1]

searchRequest: (searchRequest){ 
    userIdentification = (userIdentification){ 
     username = "" 
     password = "" 
     } 
    itineraryArr = (itineraryArray){ 
     _arrayType = "" 
     _offset = "" 
     _id = "" 
     _href = "" 
     _arrayType = "" 
     } 
    ... 
    ... 

[comma # 2]

itinerary: (itinerary){ 
    departurePoint = (locationPoint){ 
     locationId = None 
     radius = None 
     } 
    arrivalPoint = (locationPoint){ 
     locationId = None 
     radius = None 
     } 
    ... 
    ... 

non c'è nessun problema con 'userIdentification' (che è una " semplice "tipo)

Ma, 'itinerarioArr' è una matrice di 'itinerario', e non so come usare python per creare array XML.

ho provato alcune combinazioni, per esempio

itinerary0 = self.client.factory.create('itinerary') 
itineraryArray = self.client.factory.create('itineraryArray') 
itineraryArray = [itinerary0] 
searchRequest.itineraryArr = itineraryArray 

Ma tutte le mie prove sono risultati con lo stesso errore del server -

Server raised fault: 'Cannot use object of type itinerary as array' 
    (Fault){ 
     faultcode = "SOAP-ENV:Server" 
     faultstring = "Cannot use object of type itinerary as array" 
    } 

risposta

4

Credo che quello che stai cercando è:

itinerary0 = self.client.factory.create('itinerary') 
itineraryArray = self.client.factory.create('itineraryArray') 
print itineraryArray 
itineraryArray.itinerary.append(itinerary0) 

Ho dovuto farlo da solo;) Ciò che mi ha aiutato a scoprire che stava stampando sulla console. Ciò avrebbe probabilmente dato il seguente:

(itineraryArray){ 
    itinerary[] = <empty> 
} 

Cheers, Jacques

2

Per questo tipo di struttura ho impostato un attributo chiamato 'item' sull'oggetto matrice e quindi aggiungere il membro della lista ad esso. Qualcosa di simile:

itineraryArray = self.client.factory.create('itineraryArray') 
itineraryArray.item = [itinerary0] 

Quali analizza e passa bene, anche per chiamate complesse con più livelli.

6

Sono nello stesso caso, con un WS di stile RPC/codificato e un metodo che contiene un array di sapone. una richiesta di stampa (dove request = client.factory.create('Request')) dà:

(Request){ 
    requestid = None 
    option = 
    (ArrayOfOption){ 
    _arrayType = "" 
    _offset = "" 
    _id = "" 
    _href = "" 
    _arrayType = "" 
    } 
} 

La soluzione data da Jacques (1request.option.append (opzione1) 1) non funziona, come si conclude con un messaggio di errore ArrayOfOption instance has no attribute append.

La soluzione data dalla mcauth assomiglia a questo:

array = client.factory.create('ArrayOfOption') 
array.item = [option1, option2, option3, option4, option5, option6] 
request.option=array 

Funziona così così, come il messaggio SOAP risultante non mostra alcun arrayType attributo:

<option xsi:type="ns3:ArrayOfOption"> 

La soluzione migliore che ho trovato è anche la più semplice:

request.option = [option1, option2, option3, option4, option5, option6] 

Si conclude con un buon messaggio SOAP:

<option xsi:type="ns0:ArrayOfOption" ns3:arrayType="ns0:Option[6]"> 

come previsto dal lato server WS.

Problemi correlati