ColdFusion: как использовать getListItems () в SharePoint - PullRequest
4 голосов
/ 14 апреля 2009

Кто-нибудь знает, как я могу получить все элементы из списка SharePoint?

Должна быть возможность вызова функции getListItems () с 4 параметрами:

  • Один для списка, в котором хранится информация,
  • второй для запроса,
  • третий для отображаемых полей и
  • четвертый, который определяет количество строк, которые нужно вернуть.

Мой код:

<cfobject webservice="http://sharepointserver:16999/blog/_vti_bin/SiteData.asmx?wsdl" name="siteDataService"
    password="pw"
    username="user"
    >

<cfset siteDataService.GetListItems(
    "{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}", 
    "<Where><Lt><FieldRef Name=""ID"" /><Value Type=""Counter"">3</Value></Lt></Where>", 
    "<FieldRef Name=""ID"" /><FieldRef Name=""Title"" />", 
    "4"
    )>      

<cfset ServiceResponse = GetSOAPResponse(siteDataService)>
<cfdump var="#ServiceResponse#">

Но все, что я получаю, это сообщение об ошибке:

Операция веб-службы GetListItems с параметрами {{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}, 3, 4} не найдена.

Обычно вы должны передать xmlNode'ы в функцию, как сказано здесь .

Я тоже это пробовал, но не знаю точно, как создать xmlNode. Мой код, который также не работает, это:

<cfset xmlDoc = XmlNew()>
<cfset ndQuery = xmlElemNew(xmlDoc, "Query")>
<cfset ndViewFields = xmlElemNew(xmlDoc, "ViewFields")>
<cfset ndQueryOptions = xmlElemNew(xmlDoc, "QueryOptions")>

<cfset ndQuery = "<Where><BeginsWith><FieldRef Name='Name' /><Value Type='Text'>D</Value></BeginsWith></Where>">
<cfset ndViewFields = "<FieldRef Name='ID' />">
<cfset ndQueryOptions = "">

<cfset listsService.GetListItems(
    "{52D3A638-FA12-44E8-9C17-5FBCD2899199}", 
    "", 
    ndQuery, 
    ndViewFields, 
    "1", 
    ndQueryOptions, 
    ""
    )>

<cfset ServiceResponse = GetSOAPResponse(listsService)>
<cfdump var="#ServiceResponse#">

Правильно ли я называю веб-сервис?

Спасибо, Kevin


РЕДАКТИРОВАТЬ: Спасибо за ваш ответ, я думаю, что элементы XML работают.

<cfset listsService.GetListItems(
    "{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}", 
    "{1DD69D36-FD18-42B8-B57D-CCA49FD12AFE}", 
    ndQuery.xmlRoot, 
    ndViewFields.xmlRoot, 
    "1", 
    ndQueryOptions.xmlRoot,
    ""
)>

Но теперь я получаю «Исключение из-за недопустимого аргумента» (это здорово, потому что оно говорит мне, что веб-служба отвечает;)):

Cannot perform web service invocation GetListItems.

The fault returned when invoking the web service operation is:

'' java.lang.IllegalArgumentException: java.lang.ClassCastException@f70df9

The error occurred in D:\wwwroot\SharePoint-Tests\blog.cfm: line 83
81 :         "1", 
82 :         ndQueryOptions.xmlRoot,
83 :        ""
84 : )>

РЕДАКТИРОВАТЬ 2:

Это мой новый код (28 апреля)

    <cfset xmlDoc = XmlNew()>
<cfset xmlDoc.xmlRoot = xmlElemNew(xmlDoc, "xmlRoot")>
<cfset xmlDoc.xmlRoot.Query = xmlElemNew(xmlDoc, "Query")>
<cfset xmlDoc.xmlRoot.ViewFields = xmlElemNew(xmlDoc, "ViewFields")>
<cfset xmlDoc.xmlRoot.QueryOptions = xmlElemNew(xmlDoc, "QueryOptions")>    


<cfset xmlDoc.xmlRoot.Query.XmlChildren[1] = xmlElemNew(xmlDoc, "Where")>
<cfset xmlDoc.xmlRoot.Query.where.XmlChildren[1] = xmlElemNew(xmlDoc, "GT")>
<cfset xmlDoc.xmlRoot.Query.where.gt.XmlChildren[1] = xmlElemNew(xmlDoc, "Value")>

<cfdump var="#xmlDoc#">

<cfset ndQuery = XmlParse("<Query><Where><Gt><FieldRef Name='ID' /><Value Type='Counter'>0</Value></Gt></Where></Query>", true)>
<cfset ndViewFields = XmlParse("<ViewFields><FieldRef Name='ID' /><FieldRef Name='Title' /></ViewFields>", True)>
<cfset ndQueryOptions = XmlParse("<queryOptions xmlns:SOAPSDK9=""http://schemas.microsoft.com/sharepoint/soap/""><QueryOptions/></queryOptions>", True)>

<cfdump var="#ndQuery#">
<cfdump var="#ndViewFields#">
<cfdump var="#ndQueryOptions#">

<cfoutput>#XMLFormat(ndQuery)#</cfoutput><br>
<cfoutput>#XMLFormat(ndViewFields)#</cfoutput><br>
<cfoutput>#XMLFormat(ndQueryOptions)#</cfoutput><br>
<cfinvoke 
  webservice     = "#listsService#" 
  method         = "GetListItems"
  returnvariable = "result"
  timeout        = "10"
>
  <cfinvokeargument name="listName"     value="{9BE74555-1150-4AC8-ADE7-EE52923D7CE8}">
  <cfinvokeargument name="viewName"     value="">
  <cfinvokeargument name="query"        value="#ndQuery.XmlRoot#">
  <cfinvokeargument name="viewFields"   value="#ndViewFields.XmlRoot#">
  <cfinvokeargument name="rowLimit"     value="1">
  <cfinvokeargument name="queryOptions" value="#ndQueryOptions.XmlRoot#">
      <cfinvokeargument name="webID"        value="" omit="yes">

  <!--- setting "omit" to "yes" will turn the parameter to null --->
</cfinvoke>

<cfdump var="#result#" label="result">

Сообщение об ошибке:

Cannot perform web service invocation GetListItems.
The fault returned when invoking the web service operation is:
java.lang.IllegalArgumentException: argument type mismatch

Ответы [ 3 ]

2 голосов
/ 21 сентября 2012

Можете ли вы заставить работать следующий пример:

<cfinvoke webservice="http://sharepointserver:16999/blog/_vti_bin/usergroup.asmx?wsdl" method="GetUserCollectionFromWeb" password="[pw]" username="[username]" returnvariable="listOfUsers"/>

<cfdump var="#listOfUsers#">

Кроме того, является ли механизм проверки подлинности SharePoint базовой аутентификацией?

1 голос
/ 04 июня 2009

вот еще одна простая демонстрация ..

http://dotnetdreamer.com/2009/06/04/moss-web-services-accessing-sharepoint-list-data/

1 голос
/ 14 апреля 2009

Попробуйте это:

<!--- parse a bunch of XML documents, case-sensitively --->
<cfset ndQuery = XmlParse("<Where><BeginsWith><FieldRef Name='Name' /><Value Type='Text'>D</Value></BeginsWith></Where>", True)>
<cfset ndViewFields = XmlParse("<FieldRef Name='ID' />", True)>
<cfset ndQueryOptions = XmlParse("<QueryOptions />", True)>

<cfset listsService.GetListItems(
        "{52D3A638-FA12-44E8-9C17-5FBCD2899199}", 
        "", 
        ndQuery.XmlRoot, 
        ndViewFields.XmlRoot, 
        "1", 
        ndQueryOptions.XmlRoot, 

)>

<cfset ServiceResponse = GetSOAPResponse(listsService)>
<cfdump var="#ServiceResponse#">

Возможно, нет необходимости явно передавать корневой узел XML, и веб-служба точно так же обрабатывает полные объекты документа XML. В этом случае может также подойти следующий вызов:

<cfset listsService.GetListItems(
        "{52D3A638-FA12-44E8-9C17-5FBCD2899199}", 
        "",
        ndQuery, 
        ndViewFields, 
        "1", 
        ndQueryOptions, 
        ""
)>

РЕДАКТИРОВАТЬ: страница MSDN на Метод Lists.GetListItems состояния:

queryOptions: Чтобы передать пустое значение для этого параметр, включающий пустой Элемент QueryOptions выглядит следующим образом.

<queryOptions 
 xmlns:SOAPSDK9="http://schemas.microsoft.com/sharepoint/soap/">
   <QueryOptions/>
</queryOptions>

Итак, давайте попробуем это:

<cfset ndQueryOptions = XmlParse("<queryOptions xmlns:SOAPSDK9="http://schemas.microsoft.com/sharepoint/soap/"><QueryOptions/></queryOptions>", True)>

РЕДАКТИРОВАТЬ # 2

Также может быть совершенно другая проблема - последний параметр метода GetListItems() является необязательным и должен быть установлен на null, если вы не хотите передавать строку GUID.

К сожалению, используемый вами синтаксис вызова не способен выразить пропущенные параметры, а CFML не имеет буквального нуля. Вы должны преобразовать свой вызов в более подробный (но более гибкий) стиль <cfinvoke> / <cfinvokeargument> для этого:

<cfobject 
  webservice = "http://sharepointserver:16999/blog/_vti_bin/Lists.asmx?wsdl"
  name       = "listsService"
  password   = "pw"
  username   = "user"
>

<cfinvoke 
  webservice     = "#listsService#" 
  method         = "GetListItems"
  returnvariable = "result"
  timeout        = "10"
>
  <cfinvokeargument name="listName"     value="{52D3A638-FA12-44E8-9C17-5FBCD2899199}">
  <cfinvokeargument name="viewName"     value="">
  <cfinvokeargument name="query"        value="#ndQuery.XmlRoot#">
  <cfinvokeargument name="viewFields"   value="#ndViewFields.XmlRoot#">
  <cfinvokeargument name="rowLimit"     value="1">
  <cfinvokeargument name="queryOptions" value="#ndQueryOptions.XmlRoot#">
  <cfinvokeargument name="webID"        value="" omit="yes">
  <!--- setting "omit" to "yes" will turn the parameter to null --->
</cfinvoke>

<cfdump var="#result#" label="result">

Более подробное прочтение по этому вопросу можно найти на talktree.com:
. Как вызывать веб-службу, опуская необязательные аргументы метода службы

...