Jquery AJAX 调用WebService服务

对Jquery+JSON+WebService的一点认识

文章不错:http://www.cnblogs.com/tyb1222/archive/2011/10/13/2210549.html

Jquery作为一款优秀的JS框架,简单易用的特性就不必说了。在实际的开发过程中,使用JQ的AJAX函数调用WebService

的接口实现AJAX的功能也成了一种比较普遍的技术手段了。WebService接口的实现,通常都是由OOP语言实现的。所以

在WebService的接口函数中,难免可能会遇到除了简单数据类型的复杂数据类型。复杂的数据的数据类型机有可能是

WebService接口中的参数,也有可能是WebService的返回值。本文所叙述的要点为:

1、对于WebService接口复杂类型的参数,JQ调用的时候传入的JSON数据应该如何表示。?

2、JQ对WebService调用获取JSON数据类型。

3、JQ调用的时对Webservice返回的复杂数据类型有什么样要求。?

环境:JQ版本:1.4.2、VS2008 SP1。

测试一:对于WebService简单参数类型:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

WebService接口函数代码如下:

 

    [WebMethod(Description = "测试方法")]

    public string ProcessPersonalInfo(Person person)

    {

        return person.Name + person.Tel;

    }

    JQ调用代码如下:

 

        $.ajax({

 

        type: "POST",

 

        url: "WebService1.asmx/GetString",

 

        dataType: "json",

 

        contentType: "application/json; charset=utf-8",

 

        data: "{'name':'zhangsan'}",

 

        success: function(json) { alert(json.d) },

 

        error: function(error) {

 

        alert("调用出错" + error.responseText);

 

        }

    });

  

提示:在$.ajax函数中,data必须要以字符串的形式表示JSON,而不能直接用JSON数据传进去。可能有些朋友对JSON对象和JSON对象的字符串

不大好区分,其实,字符串类似C#里用“”引起来的东西,而JSON对象是直接写在{}中的。简单的测试方法是直接通过alert函数弹出,如果显示[object:object]

则为JSON对象,否则就是一个字符串。

结果如下图:

测试二:对于WebService复杂参数类型:


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

        WebService接口函数代码如下:

 

        [WebMethod(Description = "测试方法")]

        public string ProcessPersonalInfo(Person person)

        {

            return person.Name + person.Tel;

        }

 

        Person实体:

 

        public class Person

        {

            public string Name { get; set; }

 

            public int Age { get; set; }

 

            public string Address { get; set; }

 

            public string Tel { get; set; }

 

        }

 

JQ调用代码如下:

 

        $.ajax({

 

            type: "POST",

 

            url: "WebService1.asmx/ProcessPersonalInfo",

 

            dataType: "json",

 

            contentType: "application/json; charset=utf-8",

 

            data: "{'person':{'Name':'zhangsan','Age':28,'Address':'beijing',Tel:'01082658866'}}"

 

            success: function(json) { alert(json.d) },

 

            error: function(error) {

 

                alert("调用出错" + error.responseText);

            }

        });

  结果如下图:

调用过程与简单参数类型类似,就是通过在JS中用一个表示Person的person对象的字符串,发往客户端后,WebService会自动将person对象的字符串

转换为Person实体对象。

测试三:对于WebService复杂返回类型

 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

WebService接口函数代码如下:

 

        [WebMethod(Description = "测试方法")]

        public List<Person> GetPersonalList()

        {

            List<Person> persons = new List<Person>

                                    {

                                        new Person {Address = "beijing", Age = 25, Name = "zhangshan", Tel = "01082678866"}

                                    };

            return persons;

        }<br> JQ调用代码如下:

 

            $.ajax({

 

            type: "POST",

 

            url: "WebService1.asmx/GetPersonalList",

 

            dataType: "json",

 

            contentType: "application/json; charset=utf-8",

 

            success: function(json) { $(json.d).each(function() { alert(this.Name + "-" + this.Age + "-" + this.Address + "-" + this.Tel) }) },

 

            error: function(error) {

 

                alert("调用出错" + error.responseText);

 

            }

 

        });

  如下图:

也就是说对于复杂返回类型,处理方式也是简单类型基本上是一样的。

曾听到有一种观念认为,Jq调用时WebSevice,用JSON作为数据交互格式时,返回数据类型一定是可序列化的。真的是这样吗。?

.Net的基本数据类型确实是可序列化的,这一点没有疑问。那么List<T>数据类型是否可以序列化呢。?看看List<T>的元数据(Metadata)信息

就知道了。。

[DebuggerTypeProxy(typeof (Mscorlib_CollectionDebugView<T>))]

[DebuggerDisplay("Count = {Count}")]

[Serializable]

public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IList, ICollection, IEnumerable

{

/**/

}

如果上面的说法成立,在这种情况下,调用成功也无可厚非。但是问题真是这样吗。?下面继续测试一下:

测试四:对于WebService复杂返回类型

 


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

          [WebMethod(Description = "测试方法")]

        public Person GetPerson()

        {

            Person person = new Person {<br>                               Address = "beijing", Age = 27, <br>                               Name = "zhangshan", Tel = "01082678866"                               <br>                              };

            return person;

        }

 

JQ调用代码如下:

 

        $.ajax({

 

            type: "POST",

 

            url: "WebService1.asmx/GetPerson",

 

            dataType: "json",

 

            contentType: "application/json; charset=utf-8",

 

            //data: "{'person':{'Name':'zhangsan','Age':28,'Address':'beijing',Tel:'01082658866'}}",

 

            success: function(json) { $(json.d).each(function() { alert(this.Name + "-" + this.Age + "-" + this.Address + "-" + this.Tel) }) },

 

            error: function(error) {

 

                alert("调用出错" + error.responseText);

 

            }

 

        });

  如下图:

但是测试四中,GetPerson()方法返回Person数据类型。再看看Person实体的定义,根本就没有标记问可序列化。

由结果可知:JQ调用WebService,并不一定需要返回复杂类型的数据必须是可序列化的。

下面做一个有趣的测试。大家都知道WebService的返回类型不能为Hashtable类型。因为它实现了因为它实现 IDictionary接口。

测试五:对于WebService复杂返回类型


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

         [WebMethod(Description = "测试方法")]

        public Hashtable GetPersonalHashtable()

        {

            Hashtable hashtable = new Hashtable();

 

            Person person = new Person { Address = "beijing", Age = 25, Name = "zhangshan", Tel = "01082678866" };

 

            hashtable.Add(1, person);

 

            return hashtable;

        }

 

JQ调用代码如下:

 

        $.ajax({

 

            type: "POST",

 

            url: "WebService1.asmx/GetPersonalHashtable",

 

            dataType: "json",

 

            contentType: "application/json; charset=utf-8",

 

            data: data,

 

            success: function(json) { $(json.d).each(function() { alert(this["one"].Name) }) },

 

            error: function(error) {

 

                alert("调用出错" + error.responseText);

 

            }

 

        });

 

 

这样,Jq居然能调用成功。这点是有点让人意想不到的。

总结:

1、Jq与WebService之间以JSON作为数据交换形式的时候,contentType: "application/json; charset=utf-8"是必须指定的。

要不然WebService不知道以何种数据作为转换。

2、Jq调用WebService返回复杂数据类型并不一定需要类型为可序列化。

3、WebService返回的JSON数据通过".d"获取如上面测试中的alert(json.d)

时间: 2024-10-17 09:44:11

Jquery AJAX 调用WebService服务的相关文章

jquery+ajax调用webservice 实例

jquery+ajax调用webservice 实例 本文章是利用了asp教程.net的webservice 与jquery 的ajax来做一个 ajax实例 <script language="网页特效"> $("document").ready(function(){        $("#mmlog").append("data");  //这句有效,页面上指定位置有数据        $("#bt

jQuery Ajax调用WCF服务详细教程_jquery

这两天在写基于WCF服务的后台框架,过程中遇到了一些挫折,经过努力全部解决了,在此分享给大家,使用的工具是Visual Studio 2013. 该后台需要支持通过json来传递和接收数据. 首先,说说搭建过程. 第一步:创建WCF服务应用程序项目WCF. 第二步,创建服务使用的数据类 using System; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Sch

Jquery + Ajax调用webService实例代码(asp.net)_jquery

webService中要实现ajax调用,则要加这句代码: // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释. [System.Web.Script.Services.ScriptService] 代码下载 /201008/yuanma/WebService2.rar 复制代码 代码如下: //无参数调用 $(document).ready(function() { $('#btn1').click(function() { $.ajax({ typ

jQuery ajax调用WCF服务实例_jquery

恩,在由瘦客户端转换成胖浏览器端的"潮流"下,必然要使用JavaScript调用后台的各种服务. 屌丝所维护的产品通信都是使用的WCF服务,因此必然要学习这样的内容.借用jQuery强大的库,使用JavaScript访问WCF服务非常简便.同事研究了一个breeze库,那么屌丝就来试验一下ajax.这里把实现简单地记录以便马克一下,以后忘了就看这篇日志来作弊. 一.更改WCF服务的配置 默认情况下,WCF服务是不允许使用HTTP请求来访问的.我们需要将WCF服务的配置文件(注意如果有其

jQuery AJAX 调用WebService实现代码_jquery

用jQuery调用其他项目的WebService 实现登录验证功能 html输入用户名密码: 代码 复制代码 代码如下: <table style="width: 400px"> <tr> <td style="width: 200px" class="left"> Login ID: </td> <td style="width: 200px" class="l

jQuery中通过ajax调用webservice传递数组参数的问题实例详解_jquery

下面通过实例给大家说明比较直观些,更方便大家了解. 本人的项目中通过jquery.ajax调用webservice. 客户端代码如下: $.ajax({ url: "test/xxx.asmx", type: 'POST', dataType: 'xml', timeout: , data: { name: "zhangsan", tags: ["aa", "bb", "cc"] }, error: fun

jQuery实现ajax调用WCF服务的方法(附带demo下载)_jquery

本文实例讲述了jQuery实现ajax调用WCF服务的方法.分享给大家供大家参考,具体如下: 关于AJAX调用WCF服务分为跨域和不跨域两种方式,今天咱们先介绍下不跨域下的调用方法.DEMO是在VS2008写的. 经过测试与研究,发现AJAX调用WCF服务必须满足以下条件 1.wcf的通讯方式必须使用webHttpBinding 2.必须设置<endpointBehaviors>节点的值 3.服务的实现必须添加标记 复制代码 代码如下: [AspNetCompatibilityRequirem

jquery的ajax调用Webservice返回Json数组

本文章是利用jquery的ajax调用webservice返回json数组哦,json数据是网页特效的一种小型轻型数据,实时交互性更强于xml哦. json数据 {'employee':[{'name':'john','sex':'man','age':'25'},{'name':'tom','sex':'man','age':'21'},{'name':'mary','sex':'woman','age':'21'}]}     //jquery 调用webservice导入数据       

C#调用WebService服务(动态调用)

原文:C#调用WebService服务(动态调用) 1 创建WebService using System; using System.Web.Services; namespace WebService1 { /// <summary> /// Service1 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/", Description="测试服务")] [