SharePoint 2013 - 通过REST获取SPListItem版本

7

我有一个启用了版本控制的SharePoint 2013列表。 我需要通过REST获取SPListItem版本列表。 我可以通过此请求获取SPListItem:http://spbreportportal/Projects/_api/lists/getbytitle('Projects')/Items(1) 但是我在文档和响应中找不到如何检索此项的所有版本的方法。 这是否可能?

5个回答

19

似乎不可能通过REST/CSOM API获取List Item版本,但有备选方案。

使用Versions.aspx应用程序页面

思路是执行对Versions页面的GET请求:http://<server>/<site>/_layouts/versions.aspx?list={litsID}&ID=<itemID>

function getItemVersions(url,listId,itemId,success)
{
   var versionsUrl = url + '/_layouts/versions.aspx?list=' + listId + '&ID=' + itemId;  
   $.get( versionsUrl, function( data ) {
      var versionEntries = parseVersionList(data);
      success(versionEntries);
   });
}


function parseVersionList(data){
   var entries = {};
   var versionList = $(data).find('table.ms-settingsframe');


   versionList.find('tbody > tr').each(function(i){
     if(i > 0 && (i-1) % 2 == 0) {
        var verRow = $(this); //get version row
        var propsRow = verRow.next(); //get properties row
        var versionLabel = verRow.find('td:first').html().trim();
        entries[versionLabel] = {};
        //extract item properties from propsRow goes here
        //...
     }

   });   
   return entries;
}


//Usage
var webUrl = _spPageContextInfo.webAbsoluteUrl;
var listId = _spPageContextInfo.pageListId;
var listItemId = 1;
getItemVersions(webUrl,listId,listItemId,function(versionEntries){
  console.log(versionEntries);
});

使用列表SharePoint Web服务

另一个选择是利用公开的Lists SharePoint Web服务,其中包含Lists.GetVersionCollection 方法,可返回SharePoint列表中指定字段的版本信息。

SPServices示例:

$().SPServices({
  operation: "GetVersionCollection",
  async: false,
  strlistID: "Projects",
  strlistItemID: 1,
  strFieldName: "Description",
  completefunc: function (xData, Status) {
    $(xData.responseText).find("Version").each(function(i) {
      console.log("Name: " + $(this).attr("Description") + " Modified: " + $(this).attr("Modified"));
    });  
  }
}); 

有没有快速循环遍历所有项/所有版本的方法?我们希望报告当前版本,如果任何版本将选择字段更改为设置值。 - Hell.Bent
据我所知,在这两种方法中,版本信息只能按项检索。 - Vadim Gremyachev
@VadimGremyachev 我正在尝试使用您的建议从版本历史页面获取详细信息,但是在以下行出现错误: var versionList = $(data).find('table.ms-settingsframe'); 我收到的错误是无效字符。 - salah9
我收到一个错误信息,内容是“该项不存在。它可能已被其他用户删除”。 - Paul Vu

5

注意: 这在2013年似乎不起作用。我已经验证了它可以在SharePoint在线上工作,并且可能可以在2016+ 上工作,但我还没有验证后者。

自此问题最初发布以来,情况可能已经发生了变化,但现在可以使用REST API获取任何列表/库项的版本历史记录:

https://url/to/site/_api/web/Lists/getbytitle('MyListName')/items(ITEMID)/versions

这将返回当前版本和所有先前版本的一系列结果,其中包含每个版本的项目列值。
与其他REST端点一样,您可以使用$select、$filter等来进一步操作结果。

1
我的SharePoint 2013服务器上无法运行。您能详细说明此版本适用于哪个SharePoint版本吗? - Joao Silva
1
@JoaoSilva 这在SharePoint Online中对我有效。确实,似乎这在2013年不起作用,而我没有注意到问题特别是关于2013年的。我没有一个2016环境可以尝试这个。 - JLRishe
这只返回版本元数据,而不是记录值。 - Oxossi
@Oxossi 对我来说,它可以很好地返回记录值。您使用的SharePoint版本是什么? - JLRishe
我正在使用SharePoint Online。 请问您正在使用哪个版本?...并且您是否从/versions中获取先前的项目内容详细信息(即超出版本号等)? - Oxossi
@Oxossi,当您发布问题时,我没有注意到。我正在使用SharePoint在线版本,并且当我使用此版本时,我可以看到所有列值(甚至隐藏的列)。您是否不启用列表的版本控制功能? - JLRishe

1
在REST API中,您可以选择属性OData__UIVersionString。它还支持OData__ModerationStatus
例如:
GET http://site url/_api/web/lists/GetByTitle(‘Test')/items(item id)?$select=OData__UIVersionString,OData__ModerationStatus

更多信息: https://msdn.microsoft.com/zh-cn/library/office/dn292552.aspx

这并不是获取所有版本或特定版本的解决方案,而是有关该版本的更多信息。


这适用于获取当前版本的项目,但不适用于该版本或先前版本的内容。 - Alberto S.

1
为了补充 @Vadim Gremyachev 的出色答案,使用 "GetversionCollection":该接口也可以通过旧的SOAP访问。不幸的是,它一次只返回一个字段(因此我们需要大量调用...)。以下是C#片段。
        //https://blogs.msdn.microsoft.com/pinch-perfect/2016/06/04/sharepoint-web-services-read-version-history-for-column-changes/
        //http://www.indy.gov/eGov/City/DCE/Permits/Signs/_vti_bin/lists.asmx?op=GetVersionCollection
        //https://www.codeproject.com/Articles/26338/Using-the-GetListItems-GetVersionCollection-and-Up
        string strSite = 
        string strListGuid = 
        string strListItemID = 
        string strFieldName = "Title" // or some other field name
        string requestXML = "<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>" +
                            "<GetVersionCollection xmlns='http://schemas.microsoft.com/sharepoint/soap/'>" +
                            "<strlistID>"+ strListGuid + "</strlistID><strlistItemID>" + strListItemID + "</strlistItemID>" +
                            "<strFieldName>"+ strFieldName +"</strFieldName>" +
                            "</GetVersionCollection>" +
                            "</soap:Body>" +
                            "</soap:Envelope>";
        object xmlRequestObj = Activator.CreateInstance(Type.GetTypeFromProgID("Microsoft.XMLHTTP"));
        MSXML2.XMLHTTP xmlRequest = (MSXML2.XMLHTTP)xmlRequestObj;
        xmlRequest.open("Get", strSite + "/_vti_bin/Lists.asmx", false, null, null);
        xmlRequest.setRequestHeader("Content-Type", "text/xml; charset=utf-8");
        xmlRequest.setRequestHeader("SOAPAction", "http://schemas.microsoft.com/sharepoint/soap/GetVersionCollection");
        xmlRequest.send(requestXML);
        string responseText = xmlRequest.responseText;

0

关于如何从SharePoint列表中获取所有版本历史记录的更多信息:

//Get ID of the Dossier in SP list
strID = items(i - 1).getAttribute("ows_ID")
Debug.Print strID

//Get all Versions of the ID in SP list as a XML
URL1: https://path to site collection/_vti_bin/owssvr.dll?Cmd=Display&List={LIstID}&XMLDATA=TRUE&Query=*&IncludeVersions=TRUE
XDoc3.Load (URL1 & "&FilterField1=ID&FilterOp1=eq&FilterValue1=" & strID)
Set Item = XDoc3.SelectNodes("//rs:data/*")
Set temp3 = XDoc3.SelectNodes("//rs:data/*")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接