如何在Sharepoint 2013中将ChangeTokenStart和ChangeTokenEnd与Rest API一起使用

时间:2014-03-28 22:39:07

标签: json rest sharepoint sharepoint-2013

我正在尝试使用Rest Apis检索两个更改令牌之间的特定列表的项目列表。我正在使用chrome rest api client。

我的休息端点如下所示 - >

    Method: POST
    Headers:
    Authorization: bearer <Access token value>
    Accept: application/json; odata=verbose
    Content-Type: application/json; odata=verbose

    Body:
    metadata type:'SP.ChangeQuery',
    Add: 'true',
    Update: 'true',
    Item: 'true',
    ChangeTokenStart:'start token string value'

我收到以下错误:

    value: "An unexpected 'PrimitiveValue' node was found when reading from the JSON reader. A 'StartObject' node was expected."

问题: 1)我们是否需要在enter code here与ChangeTokenStart和ChangeTokenEnd方法结合使用其他方法而不是getChanges?

2)实现这一目标的最佳方法是什么?

3 个答案:

答案 0 :(得分:1)

在哪里可以获得要发送的{ChangeTime}和{ChangeNumber}的值?我收到通知(从订阅到SP列表),发生了以下更改:

"value":[
    {
      "subscriptionId":"956f4000-93ba-4e36-baf5-310d7e99b11d",
      "clientState":"TwoWayFunctionApp",
      "expirationDateTime":"2017-06-01T16:17:57.000Z",
      "resource":"fce41000-8cc9-46b9-a534-e9a3dce84739",
      "tenantId":"fabef000-b0bb-4156-b901-410a36ad78b0",
      "siteUrl":"/sites/Development",
      "webId":"302c4000-e688-408a-94b7-476f17e6fbd5"
    }
]}

(假设订阅ID是要发送的{Guid})

如果您将ChangeTokenStart和ChangeTokenEnd保留为null,您会得到哪些更改?例如所有变化都发生了变化?!

答案 1 :(得分:0)

这就是你应该如何制作帖子数据

{'query':{'__ metaadata':{'type':'SP.ChangeQuery'},'Web':true,'Update':true,'Add':true,'ChangeTokenStart':{'__ metadata ':{'type':'SP.ChangeToken'},'StringValue':'blabla'}}}

如果你查看 ChangeQuery的属性,你会发现“ChangeTokenStart”和“ChangeTokenEnd”,这两个都是复杂的对象,所以这就是你发送查询的方式。

希望这有帮助。

答案 2 :(得分:0)

SharePoint REST端点期望以下列格式提供Change Token值:

"ChangeTokenProperty": { "StringValue" : "Version;Scope;Guid;ChangeTime;ChangeNumber" }

假设以下函数用于从更改日志中获取更改:

function getChanges(webUrl,queryOptions,success,failure)
{
   var changeQueryPayload = { 
       'query':{ 
           '__metadata': { 'type': 'SP.ChangeQuery' },  
        } 
   };
   for(var key in queryOptions) {
       changeQueryPayload['query'][key] = queryOptions[key];
   }

   $.ajax({
      type: "POST", 
      headers: { 
            "accept": "application/json;odata=verbose",
            "content-type": "application/json;odata=verbose",
            "X-RequestDigest": $("#__REQUESTDIGEST").val()
      }, 
      data: JSON.stringify(changeQueryPayload),
      url: webUrl + '/_api/web/getchanges', 
      success: success,
      failure: failure 
   });
}

然后,以下示例演示了如何指定ChangeToken值:

var queryOptions = {"Update":true,"Web": true, "ChangeTokenStart": { "StringValue" : "1;2;6dfea1bb-6a93-4d49-a8cd-7e797716a8e5;635427410784300000;23922265" }};


getChanges(_spPageContextInfo.webAbsoluteUrl,queryOptions,
  function(result){
      var changes = result.d.results;
      //print info
      console.log('Found ' + changes.length + ' items');   
  },
  function(error){
     console.log(JSON.stringify(error)); 
  });

关于更改令牌

根据this post更改令牌的格式如下:

{Version};{Scope};{Guid};{ChangeTime};{ChangeNumber}