SharePoint 2010 REST API JQUery 插入、更新、删除

16

有人能解释一下或者给我一个链接,展示如何使用Jquery和SharePoint 2010 Rest API进行更新和删除操作的示例吗?

我已经实现了插入操作,并且当然可以查询,因为MSDN文档和网络上的每个教程都说明了如何查询,但我想知道是否有人曾经插入、更新、删除过数据,而不仅仅是查询的示例和教程? 是的,我知道我可以使用CSOM,但我想学习如何通过jquery和sharepoint rest来完成这个操作。

此外,我想使用Merge进行更新。

这是可行的插入代码:

function insertMilestone() {
            var mileStonesListUrl = "/_vti_bin/listdata.svc/Milestones";    
               var milestone = {};
               milestone.Title = "Testing from REST";

               var entry = JSON.stringify(milestone);

               $.ajax({
                   type: "POST",
                   url: mileStonesListUrl,
                   data: entry,
                   contentType: "application/json; charset=utf-8",
                   error: function (xhr) {
                       alert(xhr.status + ": " + xhr.statusText);
                   },

                   success: function () {
                       getAll();

                   }
               });
           }
3个回答

21

如何使用SharePoint 2010 REST接口执行CRUD操作

创建

要通过REST执行创建操作,您必须执行以下操作:

  • 使用POST动词创建HTTP请求。
  • 将要添加实体的列表的服务URL用作POST的目标。
  • 将内容类型设置为application/json
  • 将表示新列表项的JSON对象序列化为字符串,并将此值添加到请求正文中。

JavaScript示例:

function createListItem(webUrl,listName, itemProperties, success, failure) {

    $.ajax({
        url: webUrl + "/_vti_bin/listdata.svc/" + listName,
        type: "POST",
        processData: false,
        contentType: "application/json;odata=verbose",
        data: JSON.stringify(itemProperties),
        headers: {
            "Accept": "application/json;odata=verbose"
        },
        success: function (data) {
            success(data.d);
        },
        error: function (data) {
            failure(data.responseJSON.error);
        }
    });
}

使用方法

var taskProperties = {
    'TaskName': 'Order Approval',
    'AssignedToId': 12
};

createListItem('https://contoso.sharepoint.com/project/','Tasks',taskProperties,function(task){
    console.log('Task' + task.TaskName + ' has been created'); 
  },
  function(error){
    console.log(JSON.stringify(error));
  }
);

阅读

为了通过REST执行阅读操作,您必须执行以下操作:

  • 使用GET动词创建HTTP请求。
  • 将要添加实体的列表项的服务URL用作GET的目标。
  • 将内容类型设置为application/json

JavaScript示例:

function getListItemById(webUrl,listName, itemId, success, failure) {
    var url = webUrl + "/_vti_bin/listdata.svc/" + listName + "(" + itemId + ")";
    $.ajax({
        url: url,
        method: "GET",
        headers: { "Accept": "application/json; odata=verbose" },
        success: function (data) {
            success(data.d);
        },
        error: function (data) {
            failure(data.responseJSON.error);
        }
    });
}

使用方法

getListItemById('https://contoso.sharepoint.com/project/','Tasks',2,function(taskItem){
    console.log(taskItem.TaskName); 
  },
  function(error){
    console.log(JSON.stringify(error));
  }
);

更新

要更新现有实体,您必须执行以下操作:

  • 使用 POST 动词创建一个 HTTP 请求。
  • 添加一个值为 MERGEX-HTTP-Method 标头。
  • 将要更新的列表项的服务 URL 用作 POST 的目标。
  • 添加一个值为实体原始 ETag 的 If-Match 标头。

JavaScript 示例:

function updateListItem(webUrl,listName,itemId,itemProperties,success, failure)
{
   getListItemById(webUrl,listName,itemId,function(item){

      $.ajax({
         type: 'POST',
         url: item.__metadata.uri,
         contentType: 'application/json',
         processData: false,
         headers: {
                "Accept": "application/json;odata=verbose",
                "X-HTTP-Method": "MERGE",
                "If-Match": item.__metadata.etag
         },
         data: Sys.Serialization.JavaScriptSerializer.serialize(itemProperties),
         success: function (data) {
                success(data);
         },
         error: function (data) {
                failure(data);
         }
      });

   },
   function(error){
       failure(error);
   });

}

使用方法

var taskProperties = {
    'TaskName': 'Approval',
    'AssignedToId': 12  
};


updateListItem('https://contoso.sharepoint.com/project/','Tasks',2,taskProperties,function(item){
    console.log('Task has been updated'); 
  },
  function(error){
    console.log(JSON.stringify(error));
  }
);

删除

要删除一个实体,您必须执行以下操作:

  • 使用POST动词创建一个HTTP请求。
  • 添加一个值为DELETEX-HTTP-Method头。
  • 将您希望更新的列表项的服务URL用作POST的目标。
  • 使用实体的原始ETag添加一个值为If-Match的头。

JavaScript示例:

function deleteListItem(webUrl, listName, itemId, success, failure) {
    getListItemById(webUrl,listName,itemId,function(item){
        $.ajax({
            url: item.__metadata.uri,
            type: "POST",
            headers: {
                "Accept": "application/json;odata=verbose",
                "X-Http-Method": "DELETE",
                "If-Match": item.__metadata.etag
            },
            success: function (data) {
                success();
            },
            error: function (data) {
                failure(data.responseJSON.error);
            }
        });
    },
   function (error) {
       failure(error);
   });
}

使用方法

deleteListItem('https://contoso.sharepoint.com/project/','Tasks',3,function(){
    console.log('Task has been deleted'); 
  },
  function(error){
    console.log(JSON.stringify(error));
  }
);

请参考SharePoint 2010中使用REST API操作列表项文章,以获取更详细的信息。


我想添加附件,如何使用SharePoint 2010 REST接口添加多个附件? - Ram

9

这里是更新和删除,它并不像我想象的那么难,并且它可以工作。希望这能帮助到某些人,因为有很多虚假信息关于如何使用REST API,我看到了无数关于查询但没有关于插入、更新、删除的文章。

//update
           function updateMilestone(id) {

               var mileStonesUrl = "/_vti_bin/listdata.svc/Milestones";
               mileStonesUrl = mileStonesUrl + "(" + id+ ")";


               var beforeSendFunction;

               var milestoneModifications = {};
               milestoneModifications.Title = "Updated from REST";

               var updatedMilestoneData = JSON.stringify(milestoneModifications);


               //update exsiting milestone
               beforeSendFunction = function (xhr) {
                   xhr.setRequestHeader("If-Match", "*");
                   // Using MERGE so that the entire entity doesn't need to be sent over the wire.
                   xhr.setRequestHeader("X-HTTP-Method", 'MERGE');
               }

               $.ajax({
                   type: "POST",
                   contentType: "application/json; charset=utf-8",
                   processData: false,
                   beforeSend: beforeSendFunction,
                   url: mileStonesUrl,
                   data: updatedMilestoneData,
                   dataType: "json",
                   error: function (xhr) {
                       alert(xhr.status + ": " + xhr.statusText);
                   },

                   success: function () {
                       alert("Updated");
                       getAll();

                   }
               });




     function deleteMilestone(id) {

               var mileStonesUrl = "/_vti_bin/listdata.svc/Milestones";
               mileStonesUrl = mileStonesUrl + "(" + id+ ")";

               $.ajax({
                   type: "DELETE",
                   contentType: "application/json; charset=utf-8",
                   processData: false,                       
                   url: mileStonesUrl,                     
                   error: function (xhr) {
                       alert(xhr.status + ": " + xhr.statusText);
                   },
                   success: function () {
                       alert("deleted");
                       getAll();

                   }
               });

           }




           }

1
是的,我看过spservices,但它使用了CSOM和xml等技术,这些都不是很难,使用U2U CAML builder可以轻松查询。虽然很酷,但使用jquery的REST API真的很棒。我真的想学习内部工作原理,而不是通过使用别人的库来抽象所有的学习,我宁愿编写自己的框架,我没有时间限制,了解所有这些知识真的很好。我以前不理解REST merge,但现在我明白了。我在SharePoint中使用了带有自定义UI和几乎单页应用程序的jquery datatables。 - Fab
2
当我谷歌搜索时,我很惊讶所有的例子都是针对Gets和其余的是针对SPServices的。难道没有人使用REST API吗?为什么没有关于CRUD的帖子,即使是SP Pluralsight课程的作者也停在获取数据上。 - Fab
1
我也在SharePoint中开发单一应用程序。我首先连接了Service Stack并使用服务器对象模型进行了自己的实现。它运行得非常好,再加上knockout、Sammy和Require,就可以在各个方面都获胜了。 - Luis
不错,我一直在学习Service Stack,并计划做同样的事情,因为我们有很多外部数据库。我得去看看Sammy,以前没用过它。 - Fab
1
你好,Vadim Gremyachev。你有没有使用REST API和JavaScript上传附件文件到自定义列表的解决方案? - Kem Bardly
显示剩余3条评论

-1

我最近使用SP 2013的REST API进行了工作,作为一个示例POC,可用于任何调用实现,例如JQuery、C#等。

使用POSTMAN

首先获取您的摘要令牌:

在此网站上找到了一种方法:http://tech.bool.se/basic-rest-request-sharepoint-using-postman/[功劳归于原作者]

POST

http://<SharePoint Domain Url>/sites/<Site name>/_api/contextinfo

标题:

Accept : application/json;odata=verbose

正文: 清空正文

从有效载荷中使用“FormDigestValue”值,并在对SharePoint中的项目进行更改的操作时,将其放入标题中,键为:X-RequestDigest。

读取数据:

GET

http://<SharePoint Domain Url>/sites/<Site name>/_api/web/getfolderbyserverrelativeurl('/Sites/<Site Name>/Shared Documents/My Folder')/files?$select=Name

标题:

Accept : application/json;odata=verbose​

在创建、更新和删除操作时,您需要摘要令牌或授权令牌才能执行这些操作。该令牌在开始时突出显示以便检索。

创建数据 POST

http://<SharePoint Domain Url>/sites/<Site Name>/_api/web/folders​

标题:

Accept : application/json;odata=verbose

X-RequestDigest : 'GUID looking toking'

Content-Type : application/json;odata=verbose

正文:

{ '__metadata': { 'type': 'SP.Folder' }, 'ServerRelativeUrl': '/Sites/<Site Name>/Shared Documents/Some Folder/POC3'}

注意: 'ServerRelativeUrl' 后面的 POC3 文件夹是我想要创建的文件夹。

相关资源: http://msdn.microsoft.com/en-us/library/office/fp142380(v=office.15).aspx

注意: 此示例使用了 PostMan,其他应用程序可能需要您对端点进行 URL 编码。

上述请求结构可用于所有请求,相关资源突出显示了可以与 REST Api 一起使用的一些标准方法。


1
这是针对2013年的,而不是2010年。2010年使用/_vti_bin/ListData.svc,而不是/_api/web/folders​。无论如何,在2013年中,您都需要使用/_api/web/lists。我们不希望通过提供片段和参考链接来回答问题,而是提供一个可行的示例。 - vapcguy
1
感谢@vapcguy的反馈,这个问题在2014年就已经得到了解答。那时候这是我最初的回答之一,如果当时我更加懂得的话,我会创建一个代码库的。 - leeroya
是的,我想我应该早就知道了,因为那是5年前的事了。我只是想确保其他人知道API之间的差异,并引起注意,以防你(和其他可能看到它的人)仍然回答类似的问题。很高兴你在这段时间里成长了。祝好。 - vapcguy

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