• SPServices介绍之三:使用SPSerivces对象调用Web Service


    SPServices介绍之三:使用SPSerivces对象调用Web Service

    分类: SPSerivces
    在上一篇文章SPServices介绍之二中,介绍了一些SPServices的基本方法,除了这些方法,SPServices的主要用处是使用Ajax方法调用SharePoint提供的Web Service。

    先看一下语法:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $().SPServices({  
    2.     operation: "operationname",  
    3.     [webURL: "/sitepath",]  
    4.     [option1: value1,]  
    5.     [option2: value2,]  
    6.     [async: false,]  
    7.     completefunc: function (xData, Status) {  
    8.         ...do stuff...  
    9.     }  
    10. });  

    其中:

    operation用来指定Web Service 方法的名字,例如最常用的Lists Web Services中的GetListItems方法,用来获取列表中的items。

    webURL用来指定Ajax请求使用的url,默认是当前站点的url。

    options(options1,options2等等)用来指定Web Servcie调用需要的参数,不同的Web Service有不同的参数,例如GetListItems服务,需要指定listName,viewName等等。

    async用来指定Web Service的调用方式是异步还是同步的,默认Ajax的调用都是异步的,如果需要可以使用async: false来强制使用同步的方式调用Web Service

    completefunc用来指定Web Service调用成功的回调函数。

    举一个简单的例子,使用SPServices调用GetListItems方法:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $().SPServices({  
    2.                 operation: "GetListItems",  
    3.                 webURL:"/",  
    4.                 listName: "Tasks",  
    5.                 async: false,  
    6.                 completefunc: function (xData, Status) {  
    7.                     if (Status == 'success')  
    8.                     {  
    9.                         alert(xData.responseText);  
    10.                     }  
    11.                 }  
    12.             });  
    在我的环境中,运行以上代码的结果如下图所示。(Tasks列表中只有一条数据)

    可以看到我们用了非常少的代码,就完成了对GetListItems方法的调用,并且可以在completefunc方法中处理返回结果。调用Web Service返回的xml数据被保存在xData.responseXML属性中,在SPSerives库中,提供了两个很好用的方法,来处理xml数据。

    一个是用来解析xml数据的SPFilterNode

    语法是:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $(xData.responseXML).SPFilterNode(somenode)  
    可以使用这个方法分析GetListItems方法返回的xml数据,如下所示:
    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $().SPServices({  
    2.                operation: "GetListItems",  
    3.                webURL:"/",  
    4.                listName: "Tasks",  
    5.                async: false,  
    6.                completefunc: function (xData, Status) {  
    7.                    if (Status == 'success')  
    8.                    {  
    9.                        $(xData.responseXML).SPFilterNode("z:row").each(function (index, item) { alert(index); alert(item); });  
    10.                    }  
    11.                }  
    12.            });  
    这里使用SPFilterNode方法遍历每个z:row节点。


    另一个方法是将xml数据转换为Json对象的SPXmlToJson

    语法是:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $(xData.responseXML).SPFilterNode("z:row").SPXmlToJson({   
    2.   mapping: {},  
    3.   includeAllAttrs: false,    //是否包含z:row节点中的所有属性  
    4.   removeOws: true,           //是否需要移除Ows_前缀  
    5.   sparse: false              //如果是true,将不返回空的属性值<span style="font-family: Arial, Helvetica, sans-serif;">("")</span>  
    6. });  

    这里需要说明的是mapping参数,这个属性允许你指定xml节点的属性和Json对象属性之间的匹配规则,例如你希望ows_Title这个z:row节点的属性,在Json对象中的名字是“NewTitle”,类型是string类型的,那么可以添加这样一个mapping:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. ows_Title: {mappedName: "NewTitle", objectType: "Text"}  
    其中mappedName指定了Json对象中的名字,objectType指定了转换之后的JS对象。SharePoint Field对象和JS对象的对应转换关系如下:
    SPFieldType(字段类型)JavaScript Object Type(JS类型)
    Counter int
    Integer int
    DateTime Date()
    User User = {userId, userName}
    UserMulti User数组
    Lookup lookup = {lookupId, lookupValue}
    LookupMulti lookup数组
    Boolean true / false
    MultiChoice string数字
    Currency float
    Text string

    举例说明:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $().SPServices({  
    2.                 operation: "GetListItems",  
    3.                 webURL:"/",  
    4.                 listName: "Tasks",  
    5.                 async: false,  
    6.                 completefunc: function (xData, Status) {  
    7.                     if (Status == 'success')  
    8.                     {  
    9.                         var myJson = $(xData.responseXML).SPFilterNode("z:row").SPXmlToJson({  
    10.                             mapping: {  
    11.                                 ows_ID: { mappedName: "ID", objectType: "Counter" },  
    12.                                 ows_Title: { mappedName: "NewTitle", objectType: "Text" },  
    13.                                 ows_Created: { mappedName: "Created", objectType: "DateTime" },  
    14.                             },  
    15.                             includeAllAttrs: true,  
    16.                             removeOws: false  
    17.                         });  
    18.                         alert(myJson);  
    19.                         alert(myJson[0].ID);  
    20.                         alert(myJson[0].NewTitle);  
    21.                         alert(myJson[0].Created);  
    22.                     }  
    23.                 }  
    24.             });  
    运行之后myJson对象的结构是这样的:

    可以看到ows_ID已经map到ID这个属性上了,同样ows_Title也map到NewTitle这个属性上了,同样还有ows_Created,map到了Created属性。

    除了以上的两个方法之外,SPServices还提供了一个更加方面的方法:SPGetListItemsJson

    这个方法调用GetListItems这个Web Service方法,直接返回一个Json对象,非常方便使用,更省去了mapping的麻烦。

    语法:

    [javascript] view plaincopy在CODE上查看代码片派生到我的代码片
     
    1. $().SPServices.SPGetListItemsJson({  
    2.   webURL: "",  
    3.   listName: "",  
    4.   CAMLViewName: "",  
    5.   CAMLQuery: "",  
    6.   CAMLViewFields: "",  
    7.   CAMLRowLimit: "",  
    8.   CAMLQueryOptions: "",  
    9.   changeToken: "",  
    10.   contains: "",  
    11.   mapping: null,  
    12.   mappingOverrides: null,  
    13.   debug: false  
    14. });  

    这个就不举例子了。

    除了以上作为例子的GetListItems方法之外,SPService库还可以支持很多的Web Service调用,具体有哪些请参考:点击打开链接

  • 相关阅读:
    面试C#需要准备的一些基础
    学习jQuery(一),做的第一个可拖动列的Grid
    面试的两道SQL题
    SSIS ODBC方式连接mysql数据库的一个问题
    WIN7下A卡解决部分游戏(CS、CF等)无法全屏问题
    显示Deprecated: Assigning the return value of new by reference is deprecated in解决办法
    Eclipse 中文插件的安装
    安装NASM for Linux
    将Eclipse中文注释字体变大方法
    如何查看局域网内所有IP
  • 原文地址:https://www.cnblogs.com/ningang/p/4302072.html
Copyright © 2020-2023  润新知