2014-01-23 6 views
0

Я использую Python Suds для использования веб-службы, предоставляемой Sharepoint 2007. В частности, я хочу использовать UpdateListItems, предоставляемые службой List.aspx.Как изменить конверт SOAP в Python Suds?

Как упоминалось в docs в msdn, я создаю параметр xml. Но это бросает мне SoapServerException. Трассировка не используется, потому что Sharepoint 2007 вслепую выдает исключение без каких-либо подробностей.

Я также следовал рекомендациям here в документах Suds, приведенным для примера UpdateListItems. Но бесполезно. Я думаю, что проблема в том, что XML, что Suds делает для меня это:

<?xml version="1.0" encoding="UTF-8"?> 
<SOAP-ENV:Envelope xmlns:ns0="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <ns0:Body> 
     <ns1:UpdateListItems> 
     <ns1:listName>MyDocuments</ns1:listName> 
     <ns0:updates> 
      <Batch OnError="Continue" ListVersion="1"> 
       <Method ID="1" Cmd="Delete"> 
        <Field Name="ID">7</Field> 
        <Field Name="FieldRef">http://win2003/sharepoint_site/MyDocuments/aal.txt</Field> 
       </Method> 
      </Batch> 
     </ns0:updates> 
     </ns1:UpdateListItems> 
    </ns0:Body> 
</SOAP-ENV:Envelope> 

Но пример в мыльной пене Docs выглядит следующим образом:

<SOAP-ENV:Envelope xmlns:ns0="http://schemas.microsoft.com/sharepoint/soap/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/"> 
    <SOAP-ENV:Header/> 
    <SOAP-ENV:Body> 
     <ns0:UpdateListItems> 
     <ns0:listName>MySchedule</ns0:listName> 
     <Batch OnError="Continue" ListVersion="1"> 
      <Method ID="1" Cmd="New"> 
       <Field Name="ID">New</Field> 
       <Field Name="Title">Toasting</Field> 
       <Field Name="EndDate">2009-03-07 18:00:00</Field> 
       <Field Name="EventDate">2009-03-07 17:00:00</Field> 
       <Field Name="Location">Everywhere</Field> 
       <Field Name="Description">Stuff!</Field> 
      </Method> 
     </Batch> 
     </ns0:UpdateListItems> 
    </SOAP-ENV:Body> 
</SOAP-ENV:Envelope> 

Я думаю, что проблема является элементом внутри органа , Пример: ns0, пока я получаю ns1`.

Так что я пытался использовать плагины, как это было предложено Душан в этом вопросе здесь:

python suds wrong namespace prefix in SOAP request

Так я использую marshalled() метод и мой код выглядит следующим образом:

class UpdatePlugin(MessagePlugin): 
    def marshalled(self, context): 
     body = context.envelope.getChild("Body") 
     updateListItems = body[0] 
     listName = body[1] 
     updateListItems.setPrefix("ns0") 
     listName.setPrefix("ns0") 

Однако в последней строке выше приведена следующая ошибка:

ERROR:suds.plugin:'NoneType' object has no attribute 'setPrefix' 

So body is None. Ясно, что я делаю что-то неправильно. Помоги мне, пожалуйста.

ответ

1

<ns0:updates> должны быть <ns1:updates> и попробовать client.options.prettyxml = True (от this answer), потому что Suds ужасно глючит и unmaintained.

 Смежные вопросы

  • Нет связанных вопросов^_^