82483564 2012-02-15
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、VS2008SP1。
测试一:对于WebService简单参数类型:
01WebService接口函数代码如下:
02
03[WebMethod(Description="测试方法")]
04publicstringProcessPersonalInfo(Personperson)
05{
06returnperson.Name+person.Tel;
07}
08JQ调用代码如下:
09
10$.ajax({
11
12type:"POST",
13
14url:"WebService1.asmx/GetString",
15
16dataType:"json",
17
18contentType:"application/json;charset=utf-8",
19
20data:"{'name':'zhangsan'}",
21
22success:function(json){alert(json.d)},
23
24error:function(error){
25
26alert("调用出错"+error.responseText);
27
28}
29});
提示:在$.ajax函数中,data必须要以字符串的形式表示JSON,而不能直接用JSON数据传进去。可能有些朋友对JSON对象和JSON对象的字符串
不大好区分,其实,字符串类似C#里用“”引起来的东西,而JSON对象是直接写在{}中的。简单的测试方法是直接通过alert函数弹出,如果显示[object:object]
则为JSON对象,否则就是一个字符串。
结果如下图:
测试二:对于WebService复杂参数类型:
01WebService接口函数代码如下:
02
03[WebMethod(Description="测试方法")]
04publicstringProcessPersonalInfo(Personperson)
05{
06returnperson.Name+person.Tel;
07}
08
09Person实体:
10
11publicclassPerson
12{
13publicstringName{get;set;}
14
15publicintAge{get;set;}
16
17publicstringAddress{get;set;}
18
19publicstringTel{get;set;}
20
21}
22
23JQ调用代码如下:
24
25$.ajax({
26
27type:"POST",
28
29url:"WebService1.asmx/ProcessPersonalInfo",
30
31dataType:"json",
32
33contentType:"application/json;charset=utf-8",
34
35data:"{'person':{'Name':'zhangsan','Age':28,'Address':'beijing',Tel:'01082658866'}}",
36
37success:function(json){alert(json.d)},
38
39error:function(error){
40
41alert("调用出错"+error.responseText);
42}
43});
结果如下图:
调用过程与简单参数类型类似,就是通过在JS中用一个表示Person的person对象的字符串,发往客户端后,WebService会自动将person对象的字符串
转换为Person实体对象。
测试三:对于WebService复杂返回类型
01WebService接口函数代码如下:
02
03[WebMethod(Description="测试方法")]
04publicList<Person>GetPersonalList()
05{
06List<Person>persons=newList<Person>
07{
08newPerson{Address="beijing",Age=25,name="zhangshan",Tel="01082678866"}
09};
10returnpersons;
11}<BR>JQ调用代码如下:
12
13$.ajax({
14
15type:"POST",
16
17url:"WebService1.asmx/GetPersonalList",
18
19dataType:"json",
20
21contentType:"application/json;charset=utf-8",
22
23success:function(json){$(json.d).each(function(){alert(this.Name+"-"+this.Age+"-"+this.Address+"-"+this.Tel)})},
24
25error:function(error){
26
27alert("调用出错"+error.responseText);
28
29}
30
31});
如下图:
也就是说对于复杂返回类型,处理方式也是简单类型基本上是一样的。
曾听到有一种观念认为,Jq调用时WebSevice,用JSON作为数据交互格式时,返回数据类型一定是可序列化的。真的是这样吗。?
.Net的基本数据类型确实是可序列化的,这一点没有疑问。那么List<T>数据类型是否可以序列化呢。?看看List<T>的元数据(Metadata)信息
就知道了。。
[DebuggerTypeProxy(typeof(Mscorlib_CollectionDebugView<T>))]
[DebuggerDisplay("Count={Count}")]
[Serializable]
publicclassList<T>:IList<T>,ICollection<T>,IEnumerable<T>,IList,ICollection,IEnumerable
{
/**/
}
如果上面的说法成立,在这种情况下,调用成功也无可厚非。但是问题真是这样吗。?下面继续测试一下:
测试四:对于WebService复杂返回类型
01 [WebMethod(Description="测试方法")]
02publicPersonGetPerson()
03{
04Personperson=newPerson{<BR> Address="beijing",Age=27,<BR> name="zhangshan",Tel="01082678866" <BR> };
05returnperson;
06}
07
08JQ调用代码如下:
09
10$.ajax({
11
12type:"POST",
13
14url:"WebService1.asmx/GetPerson",
15
16dataType:"json",
17
18contentType:"application/json;charset=utf-8",
19
20//data:"{'person':{'Name':'zhangsan','Age':28,'Address':'beijing',Tel:'01082658866'}}",
21
22success:function(json){$(json.d).each(function(){alert(this.Name+"-"+this.Age+"-"+this.Address+"-"+this.Tel)})},
23
24error:function(error){
25
26alert("调用出错"+error.responseText);
27
28}
29
30});
如下图:
但是测试四中,GetPerson()方法返回Person数据类型。再看看Person实体的定义,根本就没有标记问可序列化。
由结果可知:JQ调用WebService,并不一定需要返回复杂类型的数据必须是可序列化的。
下面做一个有趣的测试。大家都知道WebService的返回类型不能为Hashtable类型。因为它实现了因为它实现IDictionary接口。
测试五:对于WebService复杂返回类型
01 [WebMethod(Description="测试方法")]
02publicHashtableGetPersonalHashtable()
03{
04Hashtablehashtable=newHashtable();
05
06Personperson=newPerson{Address="beijing",Age=25,name="zhangshan",Tel="01082678866"};
07
08hashtable.Add(1,person);
09
10returnhashtable;
11}
12
13JQ调用代码如下:
14
15$.ajax({
16
17type:"POST",
18
19url:"WebService1.asmx/GetPersonalHashtable",
20
21dataType:"json",
22
23contentType:"application/json;charset=utf-8",
24
25data:data,
26
27success:function(json){$(json.d).each(function(){alert(this["one"].Name)})},
28
29error:function(error){
30
31alert("调用出错"+error.responseText);
32
33}
34
35});
这样,Jq居然能调用成功。这点是有点让人意想不到的。
总结:
1、Jq与WebService之间以JSON作为数据交换形式的时候,contentType:"application/json;charset=utf-8"是必须指定的。
要不然WebService不知道以何种数据作为转换。
2、Jq调用WebService返回复杂数据类型并不一定需要类型为可序列化。
3、WebService返回的JSON数据通过".d"获取如上面测试中的alert(json.d)