如何通过UpdateListItems SOAP API调试错误在SharePoint中创建列表项?

时间:2011-05-04 20:14:03

标签: web-services sharepoint soap suds

我在调试SharePoint SOAP调用以创建列表项时非常困难。我发送的SOAP正文是:

<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>{35BC2CB3-D2FB-4D47-B711-7502819D6E2B}</ns1:listName>
         <ns1:updates>
            <Batch OnError="Continue" ListVersion="1">
               <Method ID="1" Cmd="New">
                  <Field Name="ID">New</Field>
                  <Field Name="Title">Test Summary</Field>
               </Method>
            </Batch>
         </ns1:updates>
      </ns1:UpdateListItems>
   </ns0:Body>
</SOAP-ENV:Envelope>

无论我做什么,我总是得到一个SoapServerException,其中“值不在预期的范围内”,作为细节。这是在我有完全访问权限的SharePoint网站上。这是一个新创建的列表,其中Title是唯一必需的属性。我如何弄清楚问题是什么?

FWIW,我对GetList和GetListItems等其他方法没有任何问题。我只是没有运气使用UpdateListItems添加新的列表项。

3 个答案:

答案 0 :(得分:3)

TLDR:在尝试第一次更新通话之前,请尝试设置client.options.prettyxml = True

神圣的地狱,我一整天都在努力解决一个明显相同的问题。假设您使用的是类似的suds版本(这里是suds_jurko 0.5),那么“我该如何更好地调试它?”的答案。记录:

import logging
logging.basicConfig(level=logging.INFO)
logging.getLogger('suds.client').setLevel(logging.DEBUG)
logging.getLogger('suds.transport').setLevel(logging.DEBUG)

在sax文档/元素(或与它们相邻)的某处有一个错误,导致“element.plain()”函数认为该元素为空。当client.options.prettyxml为False时,SoapClient.send()尝试使用sax Document的'plain()'方法而不是str()方法。结果是元素被解析为空,导致UpdateListItems失败,并且“值不在预期范围内”,错误。

例如:

MESSAGE:
b'<?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>B5E50422-D16B-4C5F-AE19-CFBE943C6F3F</ns1:listName>
  <updates/>
</ns1:UpdateListItems>
</ns0:Body>
</SOAP-ENV:Envelope>'

请注意,GetListItems()方法对我来说也很有效,因为sax在SOAP调用中放置了一个空的查询元素,这在技术上很好。

要解决此问题,请在调用第一个服务之前,通过在某处添加client.options.prettyxml = True来强制SoapClient.send()使用“漂亮”版本。

我没有注意到这个错误,因为我显然在它被破坏之前检查了我的SOAP对象;打开记录显示最后一刻改变。

(我意识到这是一个古老的问题,不确定这是否令人不满;但它是我能够找到我之前的实际问题并且认为它应该得到答案的最接近的问题)

答案 1 :(得分:1)

我自己有这个问题。

这是我使用的代码,似乎有效:

batch = Element('Batch').append(Attribute('OnError', 'Return'))
batch.append(Attribute('ListVersion', '1'))

method = Element('Method').append(Attribute('ID', '1'))
method.append(Attribute('Cmd', 'Update'))

method.append(Element('Field').append(Attribute('Name', 'ID')).setText(1))
method.append(Element('Field').append(Attribute('Name', 'Title')).setText('Just Changed It23223'))

batch.append(method)

updates = Element('ns1:updates')
updates.append(batch)

client.service.UpdateListItems('Test', updates)

答案 2 :(得分:0)

请确保您的列表ID正确,并且字段仅使用您要添加项目的列表的内部名称。

尝试将您的方法放在try catch块中。将下面的部分放在catch块之下,以获得异常的更多细节。

catch (soapserver.soapserverexception ex)
{    
     console.writeline(ex.detail.innertext);
}