Как создать arrayType для WSDL в Python (используя suds)? - PullRequest
6 голосов
/ 15 июля 2009

Окружающая среда:

  • Python v2.6.2
  • suds v0.3.7

WSDL (сервер), с которым я работаю, имеет следующие подразделы схемы (я попытался написать это ясно, используя простой текст) -


[подраздел № 1]

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

[подраздел № 2]

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

Нет проблем с 'userIdentification' (это «простой» тип)

Но 'itineraryArr' - это массив 'маршрутов', и я не знаю, как использовать python для создания массива XML.

Я пробовал несколько комбинаций, например

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

Но все мои испытания привели к одной и той же ошибке сервера -

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

Ответы [ 3 ]

6 голосов
/ 21 января 2011

Я в том же случае, с RPC / закодированным стилем WS и методом, который содержит массив мыла. запрос на печать (где request = client.factory.create('Request')) дает:

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

Решение, данное Жаком (1request.option.append (option1) 1), не работает, так как заканчивается сообщением об ошибке ArrayOfOption instance has no attribute append.

Решение, данное mcauth, выглядит следующим образом:

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

Это работает так, поскольку в полученном сообщении SOAP отсутствует атрибут arrayType:

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

Лучшее решение, которое я нашел, также самое простое:

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

Это заканчивается хорошим SOAP-сообщением:

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

как и ожидалось серверной стороной WS.

4 голосов
/ 16 июля 2009

Я считаю, что вы ищете:

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

Просто нужно было сделать это самому;) То, что помогло мне найти это, это печать на консоль. Это, вероятно, дало бы вам следующее:

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

Cheers, Jacques

2 голосов
/ 23 января 2010

Для этого типа структуры я устанавливаю атрибут с именем 'item' на объект массива, а затем добавляю к нему член списка. Что-то вроде:

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

Что анализирует и проходит нормально, даже для сложных вызовов с несколькими уровнями.

...