2009-07-15 11 views
6

Środowisko:Jak utworzyć arrayType dla WSDL w Pythonie (używając suds)?

  • Python v2.6.2
  • mydliny v0.3.7

WSDL (serwer) pracuję, mają następujące schematu podsekcje (próbowałem napisać to wyraźnie za pomocą zwykłego tekstu) -


[sub-se DZIAŁANIA 1]

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

[podsekcja 2]

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

nie ma problemu z 'userIdentification' (która jest " prosty "typ"

Ale "itineraryArr" jest tablicą "planu podróży" i nie wiem jak używać Pythona do tworzenia tablicy XML.

Próbowałem kilka kombinacji, na przykład

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

Ale wszystkie moje próby wynikał z tego samego błędu serwera -

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

Odpowiedz

4

Wierzę, czego szukasz jest:

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

Po prostu musiałem to zrobić sam;) To, co pomogło mi znaleźć to było drukowanie na konsoli. To byłoby chyba wam następujące:

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

Cheers Jacques

2

Dla tego typu struktury I ustawić atrybut o nazwie „pozycja” na obiekcie tablicy, a następnie dołączyć do niego elementu listy. Coś jak:

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

Który przetwarza i przekazuje w porządku, nawet w przypadku skomplikowanych połączeń z wieloma poziomami.

6

Jestem w tym samym przypadku, ze stylem RPC/zakodowanym WS i metodą, która zawiera macierz mydlaną. wniosek print (gdzie request = client.factory.create('Request')) daje:

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

rozwiązanie przyjęte przez Jacques (1request.option.append (Opcja 1) 1) nie działa, ponieważ kończy się komunikatem o błędzie ArrayOfOption instance has no attribute append.

Rozwiązanie podane przez mcauth wygląda następująco:

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

To działa tak, tak, tak otrzymaną wiadomość SOAP nie wykazuje arrayType atrybut:

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

Najlepszym rozwiązaniem znalazłem jest również najprostszy:

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

Kończy się dobrym komunikatem SOAP:

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

zgodnie z oczekiwaniami WS po stronie serwera.

Powiązane problemy