宝哥软件园

jQuery调用WebService返回JSON数据 注意参数设置

编辑:宝哥软件园 来源:互联网 时间:2021-10-04

的释放。NET Framework 3.5解决了WebService调用中的json问题。本文将介绍基于。NET Framework 3.5返回JSON数据,还介绍了用jQuery调用WebService时参数设置不当带来的问题。网上也有很多关于jQuery调用WebService的介绍,我在最近的项目中使用过很多,但是很少使用。NET Ajax。我更喜欢调用jQuery来请求WebService。有几种方法,主要讲POST和GET方法。事实上,对于安全方法,不建议使用GET方法。下面我们来说说用jquery调用WebService的参数设置不当导致的问题以及产生问题的原因。这里只讨论返回JSON数据的情况。相信大家都比较了解JSON格式数据对于ajax的便利性。如果你不知道,你可以在网上寻找这些信息。这里就不多说了,不然以后再写这方面的文章。下面是jQuery调用WebService服务器的代码:WS1和WS2是POST方法请求的方法,所以将usehttpgett设置为false,WS3和WS4是Get方法请求的方法,将usehttpgett设置为true。复制代码如下:使用系统。web . script . services;使用系统。网络服务;webservice35的命名空间{//////web service 1///[web service(命名空间=' http://tempuri.org/')]的摘要描述。[web service binding(conformisto=wsiprofiles . basicprofile 1 _ 1)][system。component model . toolbox item(false)]//要允许使用ASP.NET Ajax从脚本调用此web服务,请取消对以下行的注释。[系统。web . script . services . script service]公共类webservice1 :系统。web . services . web service {[web method][script method(使用http get=false)]公共字符串ws1 () {return' post没有参数';}[WebMethod][script method(UseHttpGet=false)]公共字符串WS2(字符串s){ return s;} [webmethod] [scriptmethod(使用http get=true)]公共字符串ws3(){返回“不带参数的get”;}[WebMethod][script method(UseHttpGet=true)]公共字符串WS4(字符串s){ return s;}}}复制代码如下: fun 1()函数{$。Ajax ({URL :' webservice1。asmx/ws1 ',type:' post ',datatype 3360' JSON ',content type 3360 ' application/JSON;charset=utf-8 ',data: ' ',success:函数(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}上面的JS方法是使用POST方法请求无参数WebService方法的代码,但是上面的代码没有以JSON格式返回正确的数据,而是以XML格式返回数据。为了使网络服务以JSON格式返回数据,有必要在请求头中将内容类型设置为应用程序/json。有人要问,你不要把contentType设置为“application/JSON”;Charset=utf-8 "?是的,但是在jquery中,如果Content-Length为0或者没有设置,它将忽略您设置的contentType。我可以看下图,这是请求头的捕获数据。可以看到内容长度为0,没有内容类型。网络服务不知道我们需要JSON格式的数据,所以它以XML格式返回给我们默认数据,因为我没有提交任何数据,所以默认数据为0。组织结构

对此我们该怎么办?继续看下面的JS代码,因为我们调用的是不带参数的WebService方法,所以我们可以提交一个空的和JSON对象“{}”,如下所示,并将数据设置为{}。复制代码如下: fun 1()函数{$。Ajax ({URL :' webservice1。asmx/ws1 ',type:' post ',datatype3360' JSON ',content type 3360 ' application/JSON;charset=utf-8 ',data :“{ 0 }”,success : function(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}现在再看下图,可以看到Content-Length已经是2了,还有Content-Type,就是我们设置的值,这样就可以正确返回JSON数据给我们使用。返回JSON格式

还有一种方法:由于jquery没有为我们设置内容类型,我们可以自己设置。如下面的代码所示,在发送数据之前,我们将Content-Type设置为“application/JSON”;Charset=utf-8 ",就是这样。复制代码如下: fun 1()函数{$。Ajax({ URL : ' webservice1.asmx/ws1', Type : ' post ',datatype3360' JSON ',data: ' ',beforeSend:函数(x){ x . SetRequestHeader(' Content-Type ',' application/JSON;charset=utf-8 ');},success:函数(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}以下是我们手动设置内容类型后捕获的请求头。我们可以看到,即使内容长度为0,其中也有一个正确的内容类型。设置了Content-Type之后

但是需要注意的是,如果我们设置jquery的contentType,发送一个空的JSON对象,手动设置Content-Type,如下代码所示:复制的代码如下: fun 1()函数{$。Ajax ({URL 3360' webservice1。asmx/ws1 ',类型:' post ',数据类型3360' JSON ',内容类型: ' application/JSON;charset=utf-8 ',data :“{ 0 }”,beforeSend:函数(x){ x . setrequestheader(' Content-Type ',' application/JSON;charset=utf-8 ');},success:函数(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}那么IE中发送的Requst头如下图所示,你会看到Content-Type有两个值,用逗号隔开。为什么呢?因为jquery为Content-Type设置了一次值,所以我们再次手动设置,而在IE中,当多次设置Content-Type的值时,会追加而不是替换。但是,这并不影响WebService向我们正确返回JSON数据,但是这种情况应该避免。IE发送的Requst  Headers

如果可以通过如上两次设置Content-Type值来正确返回JSON数据,那么下面的代码就不能正确返回JSON数据。复制代码如下: fun 1()函数{$。Ajax({ URL : ' webservice1.asmx/ws1', Type : ' post ',datatype3360' JSON ',data3360' {} ',beforeSend:函数(x){ x . SetRequestHeader(' Content-Type ',' application/JSON;charset=utf-8 ');},success:函数(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}从下图可以看出,Content-Type也有两个值,但这个值与上面的有些不同。这次,这个值不一样,一个是application/x-www-form-URL encoded,另一个是application/json。Charset=utf-8,在这种情况下,无法正确返回JSON格式的数据。这是为什么呢?那是因为我们没有为jquery设置contentType,并且提交了一个空的JSON对象,但是为什么在使用Content-Type的时候会出现这种情况呢?因为jquery的ajax通过POST方法提交数据,如果没有设置contentType,发送的数据也不是空的,那么它会为ContentType设置一个默认值,即application/x-www-form-URL encoded,所以才会出现这种情况。因此,在使用POST方法请求时,如果有提交的数据,即jquery ajax的datar属性不为空(如果不为空:1。发送一个空对象来调用无参数的WebService方法;2.请询问带有参数的网络服务方法。),必须设置内容类型属性,不能手动设置内容类型。手工设置Content-Type

下面是用参数请求WebService的方法,上面已经提到了一些情况,这里就不多说了。但是需要注意的一点是,使用POST方法请求时,不需要手动用汉字对参数值进行编码。例如,如果以下data :“{ s 3360 ' POST具有参数' } ',则不必将其写入data 3360“{ s 3360 ' encodeuri(' POST具有参数')' } '。复制代码如下: fun 2()函数{$。Ajax({ URL : ' webservice1.asmx/ws2',内容类型: '应用/JSON;Charset=utf-8 ',type:' post ',datatype:' JSON ',data: ' { s: ' post有参数' } ',success 3360 function(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}以上就是我们所说的POST方法的请求,下面是GET方法的请求。下面是一个请求无参数网络服务的GET方法,但这是一个错误的代码。怎么了?童鞋可以自己思考。我们一起来谈谈吧。复制代码如下: fun 3()函数{$。Ajax({ URL : ' webservice1.asmx/ws3', type : ' get ',datatype3360' JSON ',data3360 ' ',content type : ' application/JSON;charset=utf-8 ',success : function(JSON){ alert(JSON . d);},error:函数(x,e){ alert(x . responsetext);},complete : function(x){ alert(x . responsetext);} });}下图显示了上述代码请求捕获的请求头。让我们来看看问题出在哪里。请求所抓取的Request  Headers

下面的代码是正确的用得到方法调用无参数的WebService方法。复制代码代码如下:函数()函数{ $。Ajax({ URL : ' webservice 1。asmx/WS3 ',数据类型: 'json ',数据: ' ',发送前:函数(x){ x . setrequest header(' Content-Type ',' application/JSON;charset=utf-8 ');},成功:函数(JSON){ alert(JSON。d);},错误:函数(x,e){ alert(x . response text);},完成:函数(x){ alert(x . response text);} });} 下面的代码是正确的用得到方法调用有参数的WebService方法。复制代码代码如下:函数()函数{ $。Ajax({ URL : ' WebServiCe 1。asmx/WS4 ',dataType: 'json ',data: encodeURI('s='GET有参数),发送前:函数(x){ x . SetRequestHeader(' Content-Type ',' application/JSON;charset=utf-8 ');},成功:函数(JSON){ alert(JSON。d);},错误:函数(x,e){ alert(x . response text);},完成:函数(x){ alert(x . response text);} });} 下图是正确的用得到方法(有参数和无参数)调用WebService方法所抓取的请求标题。用GET方法

从上图可以看到,用得到方法请求,不管是有参数还是无参数,都是没有内容-长度的,所以jquery也就不能为我们设置内容类型了,我只能手工设置内容类型,所以我们也就没有必要设置jquery ajax的contentType了。需要注意的是,GET方法与邮政方法不同,有参数的时候,如果参数的值不是美国信息交换标准代码字符,要用encodeURI编一下码,要不服务端接收到的数据为乱码。

更多资讯
游戏推荐
更多+