在web应用中,前台和后台通信交互是必不可少的,如:js获取后台数据库信息、用户在前端发送控制指令等等,这些都需要通信交互。

      一般的方式是:后台暴露一个接口,然后前端对该接口发送请求,并附带相关参数。后台暴露的接口统称为web service,其中按协议分为:SOAP 和REST的。从统一性和标准性来说,基于REST的服务接口无疑是当今的主流。

      前端获取后台信息的方式也有很多种,如:asp/jsp前后台代码混合的方式;使用<script>、<iframe>标签请求后台信息;以及现在大规模的ajax方式。ajax方式对于一般web应用开发者来说,可以借助于第三方ajax框架来完成,主流的ajax框架有:JQuery、Dojo、Ext等等,他们不但有丰富的UI效果,封装了浏览器之间的差异,而且在使用ajax上也是十分简洁。

      在有些情况,我们希望了解ajax框架这些异步请求的内部是如何做到的,而XmlHttpRequest正是ajax的核心。 

 

       以下说明都是基于XmlHttpRequest的ajax方式。

       第一段代码演示的功能有:

      1、XmlHttpRequest中如何同步和异步ajax请求?

      2、如何请求Soap协议的服务?

      3、如何传递不同的数据结构给服务的(分:xml/json)?

      4、asp.net封装的ScriptManager是怎么实现ajax的?

        

       

Ajax方式 XmlHttpRequest/ScriptManger
  1 <%@ Page Language="C#" AutoEventWireup="true" CodeFile="commAjax.aspx.cs" Inherits="commAjax" %>
  2 
  3 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  4 <html xmlns="http://www.w3.org/1999/xhtml">
  5 <head >104 </html>

 

   

 

      第二段代码演示的功能有:

      1、如何请求REST协议的服务?

      2、js如何跨域?<跨域请参考: ArcGIS for Server 10.1系列 - 动态获取权限Token >

 

 

      

ajax方式 以post请求REST服务
 1 function initToken() {
 2             var XHR = commClass.get_xmlHttpRequest();
 3             if (XHR != null) {
 4                 //POST方式请求Rest
 5                 XHR.open("POST", agsTokenUri, false);
 6                 XHR.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
 7                 XHR.onreadystatechange = function () {
 8                     tokenCallback.apply(XHR);
 9                 };
10                 //IP方式
11                 XHR.send("username=wangsh&password=123456&client=referer&referer=" + appUri + "&expiration=1000&f=pjson");
12                 //HTTP Referer方式
13                 //XHR.send("username=wangsh&password=123456&client=referer&referer=" + appUri + "&expiration=1000&f=pjson");
14             }
15             XHR = null;
16         }
17 
18         /**
19         * 回调函数
20         */
21         function tokenCallback() {
22             try {
23                 if (this.readyState == 4) //请求状态为4表示成功
24                 {
25                     if (this.status == 200) //http 状态200表示OK
26                     {
27                         var _backInfo = eval('(' + this.responseText + ')');
28                         var _token = _backInfo.token;
29                         if (_token != null) {
30                             init(_token);
31                         }
32                     }
33                     else //http 返回状态失败
34                     {
35                         alert("服务端返回状态" + this.statusText);
36                     }
37                 }
38             }
39             catch (ex0) {
40             }
41         }

 

 

 

 

相关文章: