web服务(同域和跨域)

web服务请求数据更新界面的步骤

1. 服务器把数据汇集起来,通过一个web服务对外发布。
2. 浏览器加载web应用,包括HTML标记、CSS和JavaScript.
3. 应用发出一个web请求,从服务器获取汇集的信息。
4. 应用受到服务器发回的数据。
5. 浏览器根据DOM更新页面,用户会看到相应结果。
6. 实时刷新的话,使用定时器接着请求数据,返回第三步执行。

如何向Web服务做出请求?

注: 使用XMLHttpRequest获取数据的模式也成为Ajax

1.首先从一个URL开始,告诉浏览器到哪里找我们要的数据。
var url = "http://someserver.com/data.json"
//json是一种交换数据的格式
2. 创建一个请求对象
var request = new XMLHttpRequest();
//使用XMLHttpRequest构造函数创建一个新的请求对象。
3.告诉请求对象我们希望它获取的那个URL,以及要使用哪种请求。open方法只是用一个URL建立一个请求,并告诉这个请求对象要使用哪种请求,以便XMLHttpRequest验证连接。
request.open("GET", url);
//HTTP GET是获取HTTP数据的标准方法。
4. 最后要求XMLHttpRequest对象获取数据时,他会自己去获取数据,他会提供一个处理程序,数据到达时会调用这个处理程序。
request.onload = function() {
    if(request.status == 200) {
        alert(request.responseText);
    }
}

//返回码是200时,表示成功
//request.resonseText是获取他的返回数据,返回值是一个json字符串,需要解析
5.最后一步,告诉请求对象去获取数据,为此要用到send方法。
request.send(null);
//这会把请求发送到服务器。如果不打算向远程服务发送任何数据,就要传入null

以下是一个例子:

//js
window.onload = function() {
    var url = "http://localhost/sales.json"
    var request = new XMLHttpRequest(); 
    request.open("GET", url);
    request.onload = function() {
       if(request.status == 200) {
          updateSales(request.responseText);
       }
    };
    request.send(null);
}

function updateSales(responseText) {
    var salesDiv = document.getElementById("sales");
    var sales = JSON.parse(responseText);
    for (var i = 0; i<sales.length; i++){
        var sale = sales[i];
        var div = document.createElement("div");
        div setAttribute("class", "saleItem");
        div.innterHTML = sale.name + " sold " + sale.sales + " gumballs";
        salesDiv.appendChild(div);
    }
}

//对于数组中的每一项创建一个<div>,并制定class为saleItem(CSS会用到)
//用innerHTML设置<div>的内容,然后增加这个元素,作为sales<div>的子元素
//html
<body>
   <div id="sales">
   
   </div>
</body>

注意:上面代码的请求,一切都是在一个域中执行的,如果是请求的其他域的东西,浏览器会认为是不安全的,会拒绝请求数据。


跨域下的web服务

浏览器安全策略

如果从某个域提供页面本身,安全策略要求不能从另一个域获取数据。就是防止其他人进入你的系统,出入一些JavaScript,拿走了用户的个人信息,并且与服务器通信对这些数据为所欲为。

当应用所在同一个域托管数据时,XMLHttpRequest是为应用获取数据的一种好的方法。当为第三方获取数据,需要用到JSONP(JSON with Padding)

JSONP是一种使用<scrip>标记获取JSON对象的方法,这也是一种获取数据的方法。

....
<body>
   <h1>Mighty Gumball Sales</h1>
   <div id= "sales">
   </div>
   <script src="http://gumball.wickedlysmart.com"></script>
</body>

请求步骤

  1. 我们的HTML中包含一个<script>元素,这个script的源是一个Web服务的URL,这个Web服务将为我们提供JSON数据。
  2. 浏览器遇到页面中的<script>元素,并向src URL发送一个HTTP请求。
  3. 服务器正常处理这个请求,发回JSOON串之前,首先把他包装在一个函数调用中,如updateSales调用。
  4. 解析和解释JSON响应时,他包装在一个函数调用中。所以会调用这个函数,并把由JSON串创建的对象传入这个函数。

Web服务允许你指定一个回调函数。指定URL时,在末尾增加一个参数,就像这样

http://gumball.wickedlysmart.com/?callback=updateSales

当心浏览器缓存,大多数浏览器都有一个有趣的特性,如果你反复获取同一个URL,浏览器为了提高效率会把它缓存起来,所以你会反复的得到同样的缓存文件。解决方法如下:

var url = "http://gumball.wickedlysmart.com/?callback=updateSales" + "&random=" + (new Date()).getTime();

网页实时刷新

如果让网页实时刷新的话,就要设置一个定时器,可以设置每3秒请求一次网络数据。如果这样的话,需要每三秒就向服务器发一个<script src=url></script>来请求数据。就要把html中的<script>删除,在JavaScript中实时创建。

window.onload = function() {
   setInterVal(handleRefresh, 3000); //毫秒
}

function handleRefresh() {
    var url = "http://gumball.wickedlysmart.com/?callback=updateSales" + "&random=" + (new Date()).getTime()"
    
    var = newScriptElement = document.createElement("script"); //创建一个新的script元素
    newScriptElement.setAttribute("src",url); //将这个元素的src属性设置为url
    newScriptElement.setAttribute("id", "jsonp");
    
    var oldScriptElement = document.getElementById("jsonp");
    var head = document.getElementByTagName("head")[0];
    if(oldScriptElement == null) {
        head.appendChild(newScriptElement);
    }else {
        head.replaceChild(newScriptElement, oldScriptElement);
    }
}

增量更新

当实时请求数据时,就有可能请求重复数据,怎么来去除重复数据在页面的显示呢?这就用到了增量更新。设置一个lastReportTime的变量,每次请求数据时,把最后一条最新的时间传给这个变量,并且把这个变量传给服务器,来获取这个时间段以后的数据,这样就可以防止有重复数据啦。



知行办公,专业移动办公平台https://zx.naton.cn/
【总监】十二春秋之,3483099@qq.com
【Master】zelo,616701261@qq.com
【运营】运维艄公,897221533@qq.com
【产品设计】流浪猫,364994559@qq.com
【体验设计】兜兜,2435632247@qq.com
【iOS】淘码小工,492395860@qq.comiMcG33K,imcg33k@gmail.com
【Android】人猿居士,1059604515@qq.com;思路的顿悟,1217022114@qq.com
【java】首席工程师MR_W,feixue300@qq.com
【测试】土镜问道,847071279@qq.com
【数据】fox009521,42151960@qq.com
【安全】保密,你懂的。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容