我正在尝试通过iOS HTTP调用访问Sharepoint 2007 Web服务。通信协议是SOAP(1和1.2)。我能够成功执行GetList和GetListAndView。但是,当我尝试GetListItems时,我收到任意数量的错误消息,其中没有一个是有意义的。
GetListItems的SOAP调用格式(在这种情况下为1.2;但1.0存在相同的问题)是:
<?xml version="1.0" encoding="utf-8"?>
<soap12:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap12="http://www.w3.org/2003/05/soap-envelope">
<soap12:Body>
<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>TaskListSample2-0</listName>
<viewName>{13C5392C-7DBC-4803-A3B8-B377D8566A55}</viewName>
<query><Query><Where><Or><Eq><FieldRef Name="Title"></FieldRef><Value Type="Text">Test</Value></Eq><IsNotNull><FieldRef Name="Title"></FieldRef></IsNotNull></Or></Where></Query></query>
<viewFields><ViewFields><FieldRef Name="Title" /><FieldRef Name="Status" /></ViewFields></viewFields>
<rowLimit>100</rowLimit>
<queryOptions></queryOptions>
<webID>c069106a-8d18-43d6-81c2-2687f568a3c5</webID>
</GetListItems>
</soap12:Body>
</soap12:Envelope>
<Query>...</Query>
之间内容的结构与在此函数的成功.Net调用中格式化的结构完全相同。
我收到以下错误消息:
<?xml version="1.0" encoding="UTF-8"?>
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<soap:Fault>
<soap:Code>
<soap:Value>soap:Receiver</soap:Value>
</soap:Code>
<soap:Reason>
<soap:Text xml:lang="en">Exception of type 'Microsoft.SharePoint.SoapServer.SoapServerException' was thrown.</soap:Text>
</soap:Reason>
<detail>
<errorstring xmlns="http://schemas.microsoft.com/sharepoint/soap/">Root element is missing.</errorstring>
</detail>
</soap:Fault>
</soap:Body>
</soap:Envelope>
我和其他几位精通.Net和Sharepoint的程序员一起度过了天。根据对查询的各种编辑更改,我们还看到查询中的“元素<Query>
丢失或无效。”
我能得到的最接近的答案是查询格式不正确(duh)。但对于我的生活,正确的格式正在逃避我们。我们已经能够从原生的.Net应用程序成功查询服务器,但是将查询XML的确切内容和格式复制到iOS代码没有任何改变。
毋庸置疑,Microsoft文档和错误消息在犯罪上毫无用处。不,我们无法迁移到MOSS 2010.客户不会很快更新,所以我们必须使用他们现有的技术。
任何帮助都将令人难以置信。即使有人可以明确地证明2007年特定的Web服务功能已被破坏。虽然它很糟糕,但至少我们会知道我们并非完全愚蠢。但是,如果有人能够确定我实际上将查询格式错误并告诉我如何解决它,那将是惊人的。
感谢。
答案 0 :(得分:0)
我在iOS上使用SOAP查询取得了一些成功。它肯定有一个很好的学习曲线。我应该注意到我不是SP专家,所以我不一定能解释为什么你的不行。这是大量谷歌搜索和(asking on SO)的结果。
这是我执行GetListItems
时的原始XML:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<GetListItems xmlns="http://schemas.microsoft.com/sharepoint/soap/">
<listName>Notes</listName>
<query>
<Query>
<Where>
<Or>
<Eq>
<FieldRef Name="Title"></FieldRef>
<Value Type="Text">Chris Test</Value>
</Eq>
<Eq>
<FieldRef Name="Folder"></FieldRef>
<Value Type="Text">Ungrouped</Value>
</Eq>
</Or>
</Where>
</Query>
</query>
<rowLimit>0</rowLimit>
<queryOptions>
<QueryOptions xmlns:ns2="http://schemas.microsoft.com/sharepoint/soap/" xmlns="">
<IncludeMandatoryColumns>FALSE</IncludeMandatoryColumns>
<ViewAttributes Scope="Recursive" />
</QueryOptions>
</queryOptions>
</GetListItems>
</soap:Body>
</soap:Envelope>
从名为notes的自定义列表中,这将为所有条目提供标题== Chris Test OR文件夹=='Ungrouped'
编辑,我看到你有一个IsNotNull属性,这就是我这样做的方法:(为了简洁而修剪)
<query><Query>
<Where>
<Or>
<IsNotNull>
<FieldRef Name="Title"></FieldRef>
</IsNotNull>
<Eq>
<FieldRef Name="Folder"></FieldRef>
<Value Type="Text">Ungrouped</Value>
</Eq>
</Or>
</Where>
</Query></query>
答案 1 :(得分:0)
我知道这个问题超过一年了,但我的猜测是你错过了
<QueryOptions />
中的元素
<queryOptions></queryOptions>
节点。希望至少能帮助某人:)