一文快速掌握前后端通信(Ajax篇)

Ajax相关概念:

进程和线程

  • 进程:程序从开始到结束的过程。
  • 线程:程序中同时运行的多个分支中的一个。
  • 多线程:多个线程同时运行的技术,可以防止线程阻塞。

同步和异步

  • 同步:在同一个线程中执行(串行执行)
  • 同步就是张三叫李四去吃饭。李四说还有点事没忙完。于是张三等李四忙完后再一起去吃饭
  • 异步:在不同的线程中执行(并行执行)
  • 异步就是张三叫李四去吃饭 李四说还有点事没忙完。张三自己先去吃饭了。 李四忙完后自己再去吃饭

请求与响应

Request:从客户端发送给服务器的请
Response:从服务器发送给服务端的响应

Ajax核心对象

  • XMLHttpRequest 简称XHR对象

同步ajax请求

//创建xhr对象
var xhr = new XMLHttpRequest();//不支持ie6-
var xhr = new ActiveXObjext("Microsoft.XMLHTTP");//支持ie6-
  • 封装一个创建XHR的函数 使其兼容ie6-
function createXHR(){
    if(window.XMLHttpRequest){
       return new XMLHttpRequest();
    }else{
     return new ActiveXObjext("Microsoft.XMLHTTP");
    }
}
var xhr = createXHR();
  • 调用open方法:在发送请求前准备内容并不会真正发送请求,只是启动一个请求以备发送
xhr.open("get","person.json",false);
//第一个参数:请求方式:一般有get和post
//第二个参数:接口(url),只能向同一个域中使用相同端口和协议的url发送请求(同源策略)
//第三个参数:false同步,true异步

同源策略简介

 同源策略(Same origin policy)是一种约定,它是浏览器最核心也最基本的安全功能
 如果缺少了同源策略,则浏览器的正常功能可能都会受到影响。
 可以说Web是构建在同源策略基础之上的,浏览器只是针对同源策略的一种实现。
同源策略,它是由Netscape提出的一个著名的安全策略,现在所有支持JavaScript的浏览器都会使用这个策略。
所谓同源是指,域名,协议,端口相同。
  • 调用send()方法:发送请求,接受一个参数:作为请求主体发送的数据 如果没有的话(get方法)就写null
xhr.send(null);
  • 接受数据
    在这里插入图片描述

异步Ajax请求

在这里插入图片描述

//3.调用send方法
xhr.send(null);
//取消异步请求
//xhr.abort();
//4.接受数据
xhr.onreadystatechange=function(){
//xhr.readyState==4 服务器处理完成
//xhr.status==200;处理的结果是成功的
if(xhr.readyState == 4&& xhr.status ==200){
console.log(xhr.responseText);
}
console.log(xhr.readyState);

不管服务器多快 这是一个异步操作,后面的代码肯定先执行 因为在你内部新建一个线程会消耗时间

//和延时器一样 因为他是一个异步操作,不管再快也是后面的先执行
setTimeout(()=>{
console.log('0');
},0)
console.log("1");

请求头、get和post的区别

post请求 参数要放在请求体中
http可以分为:请求头和请求体
请求头:包含http的头部信息
服务器返回的响应头信息和客户端发送出去的请求头信息
我们可以获取响应头信息或者设置请求头信息
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
get和post的区别:
1.get和post 都可以获取和提交数据,但是get主要用来获取数据,而post主要用来提交数据
2.get提交的参数大小较小一般在2kb之内,post提交数据可以是很大的,一般不超过4GB
3.get的参数是接在url后面,post是在请求体内,post更安全
4.get的速度更快(相比较post来说)

Ajax跨域问题

  • 解决Ajax跨域问题一般有以下两种方式:
    * 1,JSONP
    * 2,由服务器端支持跨域 header(‘Access-Control-Allow-Origin:*’)php

      * ajax跨域:
      * 1.将后台代码和客户端代码放在一个服务器下,使用同一个服务器的相同域名,协议和端口号去访问
      * 2.后台支持允许跨域
      * 3.不适用ajax 使用JSONP
      * 
      * jsonp只不过是被包含在函数调用中的JSON
      * JSONP的优点:它不像XMLHttpRequest对象实现的Ajax请求那样受到同源策略的限制
      * 它的兼容性更好,在更加古老的浏览器中都可以运行,不需要XMLHttpRequest或ActiveX的支持
      * 并且在请求完毕后可以通过调用callback的方式回传结果。
      *  JSONP的缺点:它只支持GET请求而不支持POST等其它类型的HTTP请求;
      * 
      * JSONP实现跨域的原理: 
      * JSONP是一种非正式传输协议,该协议的一个要点就是允许用户传递一个callback参数给服务端,然后服务端返回数据时会将这个callback参数作为函数名来包裹住JSON数据,这样客户端就可以随意定制自己的函数来自动处理返回数据了。
      * JSONP本身就是一个get请求,而script节点本身也是一个get请求,这个思想是通过后端的配合(后端输出的 response text必须符合js语法)更好的利用了get请求而已。 
      * 而前端封装一个方法,通过这个方法把请求注册的回调指向全局的一个具体名字的函数,同时把具体名字函数的函数名和参数通过get请求传递给后端而已。
        jsonp 包含两个东西:一个是回调函数 一个是数据
        回调函数:当响应到来时应该在页面中调用的函数,回调函数的名字一般是在请求中指定的
        数据:传入回调函数中的json数据
    

###Ajax封装

//创建XHR
function createXHR(){
     if(window.XMLHttpRequest){
          return new XMLHttpRequest();
     }else{
		  return new ActiveObject("Microsoft.XMLHTTP");
     }
}
//封装ajax
function ajax(obj){
	//1.创建xhr对象
	var xhr= createXHR();
	//2.open
	var paramstr = getParamStr(obj.data);
	if(obj.type.LowerCase() == "get"){
	obj.url +=paramstr.length>0?("?"+paramstr):"";	
}
  xhr.open("obj.type", "obj.url", "obj.async");
   //3.send
    if (obj.type.toLowerCase() == "post") {
        xhr.send(paramstr);
    }
    else if (obj.type.toLowerCase() == "get") {
        xhr.send(null);
    }
     //4.接受数据
    if (obj.async == true) {//异步
        xhr.onreadtstatechange = function () {
            if (xhr.readyState == 4) {
                callback();
            }
        }
    } else {//同步
        callback();
    }
}
function getParamStr(obj) {//获取参数字符串 传的对象转为字符串
    let arr = [];
    for (var key in obj) {
        var str = key + "=" + obj[key];//obj的属性是变量不能用点 要用[]
        arr.push(str);
    }
    return arr.join('&');//用&去拼接
}
//因为同步和异步的某些代码是一样的所以我们抽离出来一个函数
    function callback() {
        if (xhr.status == 200) {
            //请求成功
            // console.log(xhr.responseTest);
            if (obj.success) {
                obj.success(xhr.responseText);
            }
        } else {
            //请求失败
            if(obj.fail){
                obj.fail(xhr.status);
            }
        }
    }
 ajax({//传个参数 是个对象 对象有属性(参数)有函数(回调函数)
            type:"get",//请求方式
            url:"person.json",
            data:{regname:"zhangsan",pwd:"123456"},//传的参数
            async:true,//是否异步
            //回调函数
            //请求成功
            success:function(data){
                console.log(data);
            },
            //请求失败
            fail:function(){
                console.log("请求失败!");
            }
        });

如果有哪里写的不正确,请批评指正。
本文纯属原创,如有侵权,请速联系我删除。

发布了4 篇原创文章 · 获赞 16 · 访问量 3965

猜你喜欢

转载自blog.csdn.net/qq_45090740/article/details/104358840