ajax和跨域详解编程语言

一、简介

ajax是什么?

AJAX(Asynchronous JavaScript and XML) 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。

AJAX, (异步的JavaScript和XML),一种创建交互式网页应用的网页开发技术方案。通过在后台与服务器进行少量数据交换,AJAX 可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。

传统的网页(不使用 AJAX)如果需要更新内容,必需重载整个网页面。

ajax依赖XMLHttpRequest 对象

所有现代浏览器均支持 XMLHttpRequest 对象(IE5 和 IE6 使用 ActiveXObject)。

XMLHttpRequest 用于在后台与服务器交换数据。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新,而ajax刚好依赖他,老版本得浏览器不支持的话需使用ActiveXObject。

二、原生ajax

Ajax主要就是使用 【XmlHttpRequest】对象来完成请求的操作,该对象在主流浏览器中均存在(除早起的IE),Ajax首次出现IE5.5中存在(ActiveX控件)

XmlHttpRequest对象的方法和参数:

a. void open(String method,String url,Boolen async) 
   用于创建请求 
     
   参数: 
       method: 请求方式(字符串类型),如:POST、GET、DELETE... 
       url:    要请求的地址(字符串类型) 
       async:  是否异步(布尔类型) 
  
b. void send(String body) 
    用于发送请求 
  
    参数: 
        body: 要发送的数据(字符串类型) 
  
c. void setRequestHeader(String header,String value) 
    用于设置请求头 
  
    参数: 
        header: 请求头的key(字符串类型) 
        vlaue:  请求头的value(字符串类型) 
  
d. String getAllResponseHeaders() 
    获取所有响应头 
  
    返回值: 
        响应头数据(字符串类型) 
  
e. String getResponseHeader(String header) 
    获取响应头中指定header的值 
  
    参数: 
        header: 响应头的key(字符串类型) 
  
    返回值: 
        响应头中指定的header对应的值 
  
f. void abort() 
  
    终止请求

XmlHttpRequest对象主要属性:

a. Number readyState 
   状态值(整数) 
  
   详细: 
      0-未初始化,尚未调用open()方法; 
      1-启动,调用了open()方法,未调用send()方法; 
      2-发送,已经调用了send()方法,未接收到响应; 
      3-接收,已经接收到部分响应数据; 
      4-完成,已经接收到全部响应数据; 
  
b. Function onreadystatechange 
   当readyState的值改变时自动触发执行其对应的函数(回调函数) 
  
c. String responseText 
   服务器返回的数据(字符串类型) 
  
d. XmlDocument responseXML 
   服务器返回的数据(Xml对象) 
  
e. Number states 
   服务端返回的状态码(整数),如:200、404... 
  
f. String statesText 
   服务端返回的状态文本(字符串),如:OK、NotFound...

 使用样例

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
 
    <h1>XMLHttpRequest - Ajax请求</h1> 
    <input type="button" onclick="XmlGetRequest();" value="Get发送请求" /> 
    <input type="button" onclick="XmlPostRequest();" value="Post发送请求" /> 
 
    <script src="/statics/jquery-1.12.4.js"></script> 
    <script type="text/javascript"> 
 
        function GetXHR(){ 
            var xhr = null; 
            if(XMLHttpRequest){ 
                xhr = new XMLHttpRequest(); 
            }else{ 
                xhr = new ActiveXObject("Microsoft.XMLHTTP"); 
            } 
            return xhr; 
 
        }//兼容浏览器设置 
 
        function XhrPostRequest(){ 
            var xhr = GetXHR(); 
            // 定义回调函数 
            xhr.onreadystatechange = function(){ 
                if(xhr.readyState == 4){ 
                    // 已经接收到全部响应数据,执行以下操作 
                    var data = xhr.responseText; 
                    console.log(data); 
                } 
            }; 
            // 指定连接方式和地址----文件方式 
            xhr.open('POST', "/test/", true); 
            // 设置请求头,原因是django中会按照这种请求头解析,不然收不到数据 
            xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset-UTF-8'); 
            // 发送请求 
            xhr.send('n1=1;n2=2;'); 
        } 
 
        function XhrGetRequest(){ 
            var xhr = GetXHR(); 
            // 定义回调函数 
            xhr.onreadystatechange = function(){ 
                if(xhr.readyState == 4){ 
                    // 已经接收到全部响应数据,执行以下操作 
                    var data = xhr.responseText;//获取字符串类型返回的数据 
                    console.log(data); 
                } 
            }; 
            // 指定连接方式和地址----文件方式 
            xhr.open('get', "/test/", true); 
            // 发送请求 
            xhr.send(); 
        } 
 
    </script> 
 
</body> 
</html>
二、jquery中的ajax

jquery中的ajax本质上是对javascript的ajax进行封装,所以实质还是XMLHttpRequest对象。

jquery中ajax的方法:

jQuery.get(...) 
                所有参数: 
                     url: 待载入页面的URL地址 
                    data: 待发送 Key/value 参数。 
                 success: 载入成功时回调函数。 
                dataType: 返回内容格式,xml, json,  script, text, html 
 
 
            jQuery.post(...) 
                所有参数: 
                     url: 待载入页面的URL地址 
                    data: 待发送 Key/value 参数 
                 success: 载入成功时回调函数 
                dataType: 返回内容格式,xml, json,  script, text, html 
 
 
            jQuery.getJSON(...) 
                所有参数: 
                     url: 待载入页面的URL地址 
                    data: 待发送 Key/value 参数。 
                 success: 载入成功时回调函数。 
 
 
            jQuery.getScript(...) 
                所有参数: 
                     url: 待载入页面的URL地址 
                    data: 待发送 Key/value 参数。 
                 success: 载入成功时回调函数。 
 
 
            jQuery.ajax(...) 
 
                部分参数: 
 
                        url:请求地址 
                       type:请求方式,GET、POST(1.9.0之后用method) 
                    headers:请求头 
                       data:要发送的数据 
                contentType:即将发送信息至服务器的内容编码类型(默认: "application/x-www-form-urlencoded; charset=UTF-8") 
                      async:是否异步 
                    timeout:设置请求超时时间(毫秒) 
 
                 beforeSend:发送请求前执行的函数(全局) 
                   complete:完成之后执行的回调函数(全局) 
                    success:成功之后执行的回调函数(全局) 
                      error:失败之后执行的回调函数(全局) 
                 
 
                    accepts:通过请求头发送给服务器,告诉服务器当前客户端课接受的数据类型 
                   dataType:将服务器端返回的数据转换成指定类型 
                                   "xml": 将服务器端返回的内容转换成xml格式 
                                  "text": 将服务器端返回的内容转换成普通文本格式 
                                  "html": 将服务器端返回的内容转换成普通文本格式,在插入DOM中时,如果包含JavaScript标签,则会尝试去执行。 
                                "script": 尝试将返回值当作JavaScript去执行,然后再将服务器端返回的内容转换成普通文本格式 
                                  "json": 将服务器端返回的内容转换成相应的JavaScript对象 
                                 "jsonp": JSONP 格式 
                                          使用 JSONP 形式调用函数时,如 "myurl?callback=?" jQuery 将自动替换 ? 为正确的函数名,以执行回调函数 
 
                                  如果不指定,jQuery 将自动根据HTTP包MIME信息返回相应类型(an XML MIME type will yield XML, in 1.4 JSON will yield a JavaScript object, in 1.4 script will execute the script, and anything else will be returned as a string 
 
                 converters: 转换器,将服务器端的内容根据指定的dataType转换类型,并传值给success回调函数 
                         $.ajax({ 
                              accepts: { 
                                mycustomtype: 'application/x-some-custom-type' 
                              }, 
                               
                              // Expect a `mycustomtype` back from server 
                              dataType: 'mycustomtype' 
 
                              // Instructions for how to deserialize a `mycustomtype` 
                              converters: { 
                                'text mycustomtype': function(result) { 
                                  // Do Stuff 
                                  return newresult; 
                                } 
                              }, 
                            });

Django发送ajax请求示例:

ajax和跨域详解编程语言

$(function () { 
            function csrfSafeMethod(method) { 
                return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
            } 
 
            $.ajaxSetup({ 
                beforeSend: function (xhr, settings) { 
                    if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
                        xhr.setRequestHeader("X-CSRFToken", $.cookie("csrftoken")); 
                    } 
                } 
            }); 
 
        });//页面框架加载完成设置ajax请求头带csrf

更多请参考:http://jquery.cuishifeng.cn/jQuery.Ajax.html

三、跨域ajax

1.JSONP跨域

简介:

JSONP(JSON with Padding)是JSON的一种“使用模式”,可用于解决主流浏览器的跨域数据访问的问题。由于同源策略,一般来说位于 server1.example.com 的网页无法与不是 server1.example.com的服务器沟通,而 HTML 的<script> 元素是一个例外。利用 <script> 元素的这个开放策略,网页可以得到从其他来源动态产生的 JSON 资料,而这种使用模式就是所谓的 JSONP。用 JSONP 抓到的资料并不是 JSON,而是任意的JavaScript,用 JavaScript 直译器执行而不是用 JSON 解析器解析。

特别的:由于同源策略是浏览器的限制,所以请求的发送和响应是可以进行,只不过浏览器不接受罢了

tips:

浏览器同源策略并不是对所有的请求均制约:

  • 制约: XmlHttpRequest
  • 开放: img、iframe、script等具有src属性的标签

原理:

JSONP原理使用html标签中的<script>标签的src属性向外部发请求,返回数据使用javascript解释器进行解释,从而获取返回数据。

JSONP只能发送GET请求,即使jquery中使用了post,最后也会被转化为GET请求

使用步骤:

1.创建<script>标签

2.定义src标签请求地址

3.定义请求的回调函数(一般是callback参数所对应的名字)

4.发请求获取数据

5.删除创建的src标签

javascript实现jsonp实例:

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
 
    <p> 
        <input type="button" onclick="Jsonp();"  value='提交'/> 
    </p> 
    <script type="text/javascript" src="/static/jquery-2.1.1.min.js"></script> 
    <script> 
        function Jsonp(){ 
            var tag = document.createElement('script'); 
            tag.src = "https://suggest.taobao.com/sug?code=utf-8&q=卫衣&callback=cb"; 
            document.head.appendChild(tag); 
            document.head.removeChild(tag); 
 
        } 
        function cb(data) { 
            console.log(data) 
        } 
    </script> 
</body> 
</html> 

 2.jquery 实现跨域请求

jquery实现跨域请求本质上和javascript一样

demo:

<!DOCTYPE html> 
<html> 
<head lang="en"> 
    <meta charset="UTF-8"> 
    <title></title> 
</head> 
<body> 
    <p> 
        <input type="button" onclick="Jsonp1();"  value='提交'/> 
    </p> 
    <script type="text/javascript" src="/static/jquery-2.1.1.min.js"></script> 
    <script> 
        function Jsonp1(){ 
            $.ajax({ 
                url: "https://suggest.taobao.com/sug?code=utf-8&q=卫衣&callback=cb", 
                type: 'GET', 
                dataType: 'JSONP', 
                success: function(data, statusText, xmlHttpRequest){ 
                    console.log(data); 
                } 
            }) 
        } 
 
    </script> 
</body> 
</html>

 

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/12473.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论