如何在Python Suds中修改SOAP信封?

时间:2014-01-23 11:49:13

标签: python soap sharepoint-2007 suds

我正在使用Python Suds来使用Sharepoint 2007提供的Web服务。 具体来说,我想使用Lists.aspx服务提供的UpdateListItem。

正如在msdn的docs中所提到的,我正在创建xml参数。但它给了我一个SoapServerException。回溯没有任何用处,因为Sharepoint 2007在不提供任何细节的情况下盲目地抛出异常。

我还在为UpdateListItems示例提供的Suds文档中遵循了指南here。但没有用。我认为问题在于Suds为我制作的XML是这样的:

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

但是suds 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>

我认为问题是Body内部的元素。当我得到ns1`时,示例说ns0

所以我尝试使用插件,正如dusan在这个问题中所建议的那样:

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'

所以body本身就是None。显然我做错了什么。请帮帮我。

1 个答案:

答案 0 :(得分:1)

<ns0:updates>应为<ns1:updates>,并尝试client.options.prettyxml = True(来自this answer),因为Suds非常错误且unmaintained