`
wfdoublext
  • 浏览: 129894 次
  • 性别: Icon_minigender_1
  • 来自: 青岛
社区版块
存档分类
最新评论

webservice and js

阅读更多

  •  

      jQuery调用WebService网上的介绍也比较多,最近的项目中我也用到不少,一直都很少用.NET Ajax,比较钟情于jQuery调用请求WebService有几种方法,这主要说一下POST与GET方法,其实安全方法考虑不建议使用GET方法,下面就说一下用jquery调用WebService的参数设置及设置不当所出现的问题,还有出现问题的原因。我们这里只讨论返回JSON数据的情况,相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的可以从网上找一下这方面的资料来看一下,这里就不多说了,或者我以后再写一篇这方面的文章。

      下面是jQuery调用WebService服务器端代码:

      WS1和WS2方法为POST方法请求的方法,所以设置UseHttpGet 为false,WS3与WS4为GET方法请求的方法,设置UseHttpGet 为true。

using System.Web.Script.Services;  
using System.Web.Services;  
namespace WebService35  
{  
    ///   
    /// WebService1 的摘要说明  
    ///   
    [WebService(Namespace = "http://tempuri.org/")]  
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]  
    [System.ComponentModel.ToolboxItem(false)]  
    // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。  
    [System.Web.Script.Services.ScriptService]  
    public class WebService1 : System.Web.Services.WebService  
    {  
        [WebMethod]  
        [ScriptMethod(UseHttpGet = false)]  
        public string WS1()  
        {  
            return "POST无参数";  
        }  
        [WebMethod]  
        [ScriptMethod(UseHttpGet = false)]  
        public string WS2(string s)  
        {  
            return s;  
        }  
        [WebMethod]  
        [ScriptMethod(UseHttpGet = true)]  
        public string WS3()  
        {  
            return "GET无参数";  
        }  
        [WebMethod]  
        [ScriptMethod(UseHttpGet = true)]  
        public string WS4(string s)  
        {  
            return s;  
        }  
    }     
} 
 

 

function fun1() {  
           $.ajax({  
               url: "WebService1.asmx/WS1",  
               type: "POST",  
               dataType: "json",  
               contentType: "application/json; charset=utf-8",  
               data: "",  
               success: function(json) {  
                   alert(json.d);  
               },  
               error: function(x, e) {  
                   alert(x.responseText);  
               },  
               complete: function(x) {  
                   alert(x.responseText);  
               }  
           });  
       } 

 上面的JS方法为用POST方法请求无参数的WebService方法的代码,不过以上代码并不能返回正确的JSON格式的数据,而是返回XML格式的数据,回为要使WebService返回JSON格式的数据,要在Request Headers中设置Content-Type为application/json,有人要问了,你不设置了contentType为“application/json; charset=utf-8”了吗?没错,是设置了,不过在jquery中,如果Content-Length为0或者没有设置,它会忽略你设置的contentType的,我可以看下面的这个图,这是抓取的Request Headers的数据,可以看到Content-Length为0,并且没有Content-Type,所WebService就不知道我们需要JSON格式的数据,它就返回了默认的XML格式的数据给我们,之所以为0,是因为我没有提交任何数据。

这要怎么办呢?继续看下面的JS代码,因为我们这里是调用的一个没能参数的WebService方法,所以我们可以提交一个空和JSON对象“{}",如下所示,设置data为{}。

function fun1() {  
            $.ajax({  
                url: "WebService1.asmx/WS1",  
                type: "POST",  
                dataType: "json",  
                contentType: "application/json; charset=utf-8",  
                data: "{}",  
                success: function(json) {  
                    alert(json.d);  
                },  
                error: function(x, e) {  
                    alert(x.responseText);  
                },  
                complete: function(x) {  
                    alert(x.responseText);  
                }  
            });  
        }

 还有一种方法就是:既然jquery不给我们设置Content-Type,我们可以自己设置,如下面的代码所示,我们在发送数据之前设置一下Content-Type为“application/json; charset=utf-8”,这样就可以了。

 

function fun1() {  
            $.ajax({  
                url: "WebService1.asmx/WS1",  
                type: "POST",  
                dataType: "json",  
                data: "",  
                beforeSend: function(x) {  
                    x.setRequestHeader("Content-Type", "application/json; charset=utf-8");  
                },  
                success: function(json) {  
                    alert(json.d);  
                },  
                error: function(x, e) {  
                    alert(x.responseText);  
                },  
                complete: function(x) {  
                    alert(x.responseText);  
                }  
            });  
        } 

 下面是我们手工设置了Content-Type之后抓取的Request Headers,可以看到,即使Content-Length为0,里面也有了正确的Content-Type了。

不过,需要注意的是:如果我们设置了jquery的contentType,又发送了一个空的JSON对象,并且还手工设置了Content-Type,就如下代码所示:

function fun1() {  
            $.ajax({  
                url: "WebService1.asmx/WS1",  
                type: "POST",  
                dataType: "json",  
                contentType: "application/json; charset=utf-8",  
                data: "{}",  
                beforeSend: function(x) {  
                    x.setRequestHeader("Content-Type", "application/json; charset=utf-8");  
                },  
                success: function(json) {  
                    alert(json.d);  
                },  
                error: function(x, e) {  
                    alert(x.responseText);  
                },  
                complete: function(x) {  
                    alert(x.responseText);  
                }  
            });  
        } 

 那么在IE发送的Requst Headers就如下图所示,你会看到Content-Type有两个用逗号隔开的值,这是为什么呢?因为,jquery为Content-Type设置了一次值,我们手工又设置一次,而在IE是多次设置Content-Type的值它会追加,而不是替换,不过这并不影响WebService正确返回JSON数据给我们,不过应该避免这种情况出现。

果说上面那种设置两次Content-Type的值还能正确的返回JSON数据,那么下面代码就不能正确返回JSON数据了。

function fun1() {  
            $.ajax({  
                url: "WebService1.asmx/WS1",  
                type: "POST",  
                dataType: "json",  
                data: "{}",  
                beforeSend: function(x) {  
                    x.setRequestHeader("Content-Type", "application/json; charset=utf-8");  
                },  
                success: function(json) {  
                    alert(json.d);  
                },  
                error: function(x, e) {  
                    alert(x.responseText);  
                },  
                complete: function(x) {  
                    alert(x.responseText);  
                }  
            });  
        } 
 

    从下图可以看到Content-Type也有两个值,不过这个和上面那个还有点不一样,这次呢这个值是不一样的,一个是application/x-www-form-urlencoded,一个是application/json; charset=utf-8,这种情况就不能正确的返回JSON格式的数据了。这又是为什么呢?这是因为我们没有为jquery设置contentType为,并且又提交了一个空的JSON对象,可以为什么这样就会使用Content-Type出现这样的情况的呢?因为jquery的ajax用POST方法提交数据的时候,如果没有设置contentType,并且所发送的数据不为空,那么它就会为ContentType设置一个默认值,也就是application/x-www-form-urlencoded,所以就会出现这种情况了。

    所以呢,在用POST方法请求的时候,如果有提交数据,也就是jquery ajax的datar属性不空的情况下(不为空的情况:1.发送一个空对象调用无参数的WebService方法;2.请一个有参数的WebService方法。),一定要设置contentType属性,并且不能手工设置Content-Type了。

    下面是请求有参数的WebService方法,一些情况在上面也都说过了,这里就不多说了。

    不过有一点要注意,就是用POST方法请求的时候,不用手工去编码有汉字的参数值,如下面的data: "{s:'POST有参数'}",就不用写成data: "{s:"+encodeURI('POST有参数')+"}"了。

function fun2() {  
            $.ajax({  
                url: "WebService1.asmx/WS2",  
                contentType: "application/json; charset=utf-8",  
                type: "POST",  
                dataType: "json",  
                data: "{s:'POST有参数'}",  
                success: function(json) {  
                    alert(json.d);  
                },  
                error: function(x, e) {  
                    alert(x.responseText); ;  
                },  
                complete: function(x) {  
                    alert(x.responseText);  
                }  
            });  
        } 
 

    以上是我们说的用POST方法请求,下面是用GET方法请求。

    下面是一个用GET方法请求一个无参数的WebService方法,不过这是一段错误的代码,错在哪儿呢,各们童鞋可以自己想一下,我们下面一起说。

function fun3() {  
     $.ajax({  
         url: "WebService1.asmx/WS3",  
         type: "GET",  
         dataType: "json",  
         data: "",  
         contentType: "application/json; charset=utf-8",  
         success: function(json) {  
             alert(json.d);  
         },  
         error: function(x, e) {  
             alert(x.responseText);  
         },  
         complete: function(x) {  
             alert(x.responseText);  
         }  
     });  
 } 
  下面的代码是正确的用GET方法调用无参数的WebService方法。
     function fun3() {
                $.ajax({
                    url: "WebService1.asmx/WS3",
                    dataType: "json",
                    data: "",
                    beforeSend: function(x) {
                        x.setRequestHeader("Content-Type", "application/json; charset=utf-8");
                    },
                    success: function(json) {
                        alert(json.d);
                    },
                    error: function(x, e) {
                        alert(x.responseText);
                    },
                    complete: function(x) {
                        alert(x.responseText);
                    }
                });
            }
     
    下面的代码是正确的用GET方法调用有参数的WebService方法
      function fun4() {
                  $.ajax({
                      url: "WebService1.asmx/WS4",
                      dataType: "json",
                      data: encodeURI("s='GET有参数'"),
                      beforeSend: function(x) {
                          x.setRequestHeader("Content-Type", "application/json; charset=utf-8");
                      },
                      success: function(json) {
                          alert(json.d);
                      },
                      error: function(x, e) {
                          alert(x.responseText);
                      },
                      complete: function(x) {
                          alert(x.responseText);
                      }
                  });
              }
       

        下图是正确的用GET方法(有参数和无参数)调用WebService方法所抓取的Request Headers。

        用GET方法

        从上图可以看到,用GET方法请求,不管是有参数还是无参数,都是没有Content-Length的,所以jquery也就不能为我们设置Content-Type了,我只能手工设置Content-Type,所以我们也就没有必要设置jquery ajax的contentType了。

        需要注意的是,GET方法与POST方法不同,有参数的时候,如果参数的值不是ASCII字符,要用encodeURI编一下码,要不服务端接收到的数据为乱码。

      分享到:
      评论

      相关推荐

        JS调用WebService源码

        JavaScript(JS)调用WebService是Web开发中常见的一种交互方式,允许前端JavaScript代码与后端服务进行通信,实现数据的动态获取和提交。本压缩包包含了一个简单的示例项目——"WebApplication1",用于演示如何使用...

        Js调用webService示例

        在JavaScript中调用WebService,通常采用AJAX(Asynchronous JavaScript and XML)技术,尽管现在XML已经不是唯一的数据交换格式,JSON更常被使用。以下是一个简单的AJAX调用WebService的JavaScript示例: ```...

        .net项目,利用js调用webservice连接数据库

        3. **AJAX**:在本项目中,JavaScript与Web Service之间的通信很可能使用了AJAX(Asynchronous JavaScript and XML),尽管实际传输的数据可能是JSON格式。AJAX允许页面在不刷新整个页面的情况下与服务器交换数据并...

        MVC调用webService

        在MVC中,JavaScript通常用于增强用户体验,通过AJAX(Asynchronous JavaScript and XML)技术实现在不刷新整个页面的情况下更新视图。在本例中,JavaScript将用于调用WebService。 3. **WebService基础知识** ...

        使用Js调用WebService

        在JavaScript中,通常使用Ajax(Asynchronous JavaScript and XML)技术来异步地调用WebService。Ajax允许我们在不刷新整个页面的情况下与服务器进行通信。XMLHttpRequest对象是实现Ajax的核心,它提供了一个发送...

        js获取webservice天气

        JavaScript 获取 Web Service 天气预报是一项常见的Web开发任务,它涉及到使用 AJAX (Asynchronous JavaScript and XML) 技术与Web服务进行异步通信,获取特定城市的天气信息。在这个示例中,我们看到一个通过...

        domino中运用webservice

        5. **JavaScript调用WebService**:在客户端,可以通过JavaScript直接调用WebService,特别是在XPages应用中,可以使用dojo.xhrPost或其他Ajax库来实现。这通常涉及到创建XMLHttpRequest对象,构造SOAP请求,并处理...

        HTTP接口和WebService接口

        WebService接口利用WSDL(Web Services Description Language)定义服务接口,UDDI(Universal Description, Discovery, and Integration)用于服务注册和发现,以及SOAP进行消息传输。相比于HTTP接口,WebService...

        JS调用WebService示例

        在Web页面中,通常使用AJAX(Asynchronous JavaScript and XML,异步JavaScript和XML)技术来异步发送请求到服务器并获取响应。在这个例子中,通过创建一个XMLHttpRequest对象(在旧版IE浏览器中使用ActiveXObject)...

        ajax异步调用webservice实例

        在Web开发中,AJAX(Asynchronous JavaScript and XML)是一种创建动态网页的技术,它允许在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页内容。本实例将重点讲解如何利用AJAX进行异步调用WebService...

        WebService操作数据库实例

        WSDL(Web Services Description Language)用于描述WebService的接口,UDDI(Universal Description, Discovery, and Integration)则提供了服务注册和发现机制。 在C#中,我们可以使用.NET框架提供的ASMX(ASP...

        xmlhttp调用WebService

        在本篇文章中,我们将深入探讨XMLHTTP对象、WebService以及它们在ASP和JavaScript(JS)环境中的结合使用。 首先,XMLHTTP对象是微软ActiveX的一个组件,它支持HTTP协议,可以用于创建无刷新的Ajax(Asynchronous ...

        WebService实现天气预报

        它使用WSDL(Web Service Description Language)定义服务接口,UDDI(Universal Description, Discovery and Integration)进行服务注册和查找,而SOAP(Simple Object Access Protocol)则用于消息传输。...

        jQuery使用Ajax方法调用WebService.doc

        在Web开发领域中,Ajax(Asynchronous JavaScript and XML)技术被广泛应用于实现页面局部刷新等功能,极大地提升了用户体验。结合jQuery这一流行的JavaScript库,开发者可以更加便捷地利用Ajax与服务器进行数据交换...

        引用webservice实例,添加页面功能

        6. **添加页面功能**:将调用WebService的部分集成到Web页面中,这可能涉及到前端JavaScript或者后端服务器端语言如ASP.NET、PHP或JSP。页面上的按钮、表单或其他交互元素可以触发对WebService的调用,处理返回的...

        ajax 调用WebService 很简单的demo

        Ajax(Asynchronous JavaScript and XML)是一种在不重新加载整个网页的情况下更新部分网页的技术。它通过JavaScript与服务器进行通信,实现了页面的局部刷新,提高了用户体验。Ajax的核心是XMLHttpRequest对象,它...

        jQuery使用Ajax方法调用WebService

        首先,理解Ajax(Asynchronous JavaScript and XML)的核心概念是关键。Ajax允许网页在不刷新整个页面的情况下与服务器进行通信,实现了数据的动态更新。jQuery通过封装Ajax函数,使得开发者可以更方便地使用Ajax...

        js调用webservice客户端编写

        接下来,我们需要使用AJAX(Asynchronous JavaScript and XML)技术来发送SOAP请求。虽然AJAX名称中有XML,但现代实现可以处理JSON和其他数据格式。使用XMLHttpRequest对象或者更现代的fetch API,我们可以向...

        ajax调用webservice_demo

        首先,我们需要了解Ajax,即异步JavaScript和XML(Asynchronous JavaScript and XML)。尽管其名称中包含“XML”,但实际应用中,数据格式可以是JSON、XML或其他文本格式。Ajax的主要优点在于它可以在不刷新整个页面...

        webservice运用案例

        这通常通过AJAX(Asynchronous JavaScript and XML)或者现代Web技术如Fetch API实现。 异步登录验证过程如下: 1. 用户在客户端填写用户名和密码。 2. 客户端通过JavaScript发送一个异步请求到WebService端点,...

      Global site tag (gtag.js) - Google Analytics