ajax和axios使用和方法

心里最崇拜的那个人,不必变成那个人,而是用那个人的精神和方法,去变成你自己
----本文来自拉勾大前端

Ajax

  • AJAX就是浏览器提供的一套API,可以通过javascript调用,从而实现代码控制请求与响应,通过javascript进行网络编程
    // jQuery 中的 Ajax 方法
    $.ajax({
      url: "https://jsonplaceholder.typicode.com/users",
      type: "GET",
      dataType: "json",
      data: {"id": 1},
      success: function (data) {
        // 使用请求成功的数据
        console.log(data);
      }
    })
    

ajax请求

  • 创建XMLHttpRequest类型的对象
  • 准备发送,打开与网址之间的连接
  • 执行发送动作
  • 指定xhr状态变化事件处理函数
    // 1.创建一个 XMLHttpRequest 类型的对象  --- 相当于打开了一个浏览器
    var xhr = new XMLHttpRequest();
    // 2.打开一个与网址之间的连接  --- 相当于在地址栏输入网址
    xhr.open("GET","https://jsonplaceholder.typicode.com/users");
    // 3.通过连接发送一次请求 --- 相当于点击回车或者超链接
    xhr.send(null);
    // 4.指定 xhr 状态变化事件处理函数   --- 相当于处理网页呈现后的操作
    xhr.onreadystatechange = function () {
      // 通过判断 xhr 的 readyState ,确定此次请求是否完成
      if (this.readyState === 4) {
        console.log(this.responseText)
      }
    }
    

原生Ajax详解

  • readyState属性:readyState属性返回一个XMLHttpRequest代理当前所处的状态,由于readystatechange事件是在xhr对象状态变化时触发
    • 0:代理XHR被创建,但尚未调用open()方法
    • 1:open()方法已经被调用,建立了连接
    • 2:send()方法已经被调用,并且已经可以获取状态行和响应头
    • 3:响应体下载中,responseText属性可能已经包含部分数据
    • 4: 响应体下载完成,可以直接使用responseText
// 1.创建一个 XMLHttpRequest 类型的对象 
var xhr = null;
// 兼容写法
if (window.XMLHttpRequest) {
  // 标准浏览器
  xhr = new XMLHttpRequest();
} else {
  // IE 6 浏览器
  xhr = new ActiveXObject("Microsoft.XMLHTTP");
}
// 2.open() 方法开启请求
// xhr.open("GET","https://jsonplaceholder.typicode.com/users?id=1");
xhr.open("POST","https://jsonplaceholder.typicode.com/users");
// 设置请求头
// 一般 get 方法不需要设置,而 post 方法必须设置
xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
// 3.send() 方法发送一次请求
// 如果是 get 方法请求,不需要再 send 中传参数,它如果想传参数,直接写在网址上
// xhr.send(null);
xhr.send("name=harry&age=19");

xhr.onreadystatechange = function () {
  // 通过判断 xhr 的 readyState ,确定此次请求是否完成
  if (this.readyState === 4) {
    console.log(this.responseText)
  }
}

同步和异步

  • xhr.open()方法第三个参数要求传入一个boolean值,作用就是设置此次请求时否采用异步方式执行
  • 默认为true异步,如果需要同步执行可以通过传递false实现
  • 如果采用同步方式执行,则代码会卡死在xhr.send()
  • 建议:为了让这个事件可靠,在发送请求send()之前,一定是先注册readystatechange

数据格式

  • XML数据类型(淘汰)
  • JSON数据类型
    • JSON数据不需要存到变量中
    • 结束不需要写分号
    • JSON数据中属性名必须加引号
  • 使用json对象的parse方法可以将字符串转换成对象格式
    //可以通过这种方法将获得的json数据转换成字符串
    var strObj = JSON.parse(str);
    console.log(strObj.name)
    

json-server

  • 方便我们自己上传json数据,需要在本地搭建一个临时服务器
  • json-server是一个Node模块,运行Express服务器,你可以指定一个json文件作为api的数据源
  • 网址:https://github.com/typicode/json-server
  • 命令行输入:json-server --watch 文件名.json

原生Ajax--GET请求

var xhr =new XMLHttpRequest();
//发送get请求
//在open中传参
xhr.open("GET","http://localhost:3000/posts?id=1");
xhr.send(null);
xhr.onreadystatechange = function(){
  if(this.readyState === 4){
    console.log(this.responseText);
  }
}

原生Ajax--POST请求

  • post请求过程中,都是采用请求体承载需要提交的数据
  • 需要设置请求头中的content-type,以便于服务端接收数据
  • 需要提交到服务端的数据可以通过send方法的参数传递
    var xhr = new XMLHttpRequest();
    //POST请求
    xhr.open("POST","http://localhost:3000/posts");
    //post要设置请求头
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    //向服务器添加数据
    // xhr.send("age=19")
    xhr.send(JSON.stringify({
      "name": "dxa",
      "age": 18,
      "class": "lagou"
    }))
    // xhr.send({"age":19})
    xhr.onreadystatechange = function(){
      if(this.readyState === 4){
        console.log(this.responseText)
      }
    }
    

封装AJAX函数

// 封装自己的 Ajax 函数
/**
  * 参数1:{string}    method  请求方法
  * 参数2:{string}    url     请求地址
  * 参数3:{Object}    params  请求参数
  * 参数4:{function}  done    请求完成后执行的回调函数
*/ 
function ajax(method, url, params, done) {
  // 统一将方法中的字母转大写,便于后面判断
  method = method.toUpperCase();
  // 书写 IE 6 的兼容
  var xhr = window.XMLHttpRequest  
  ? new XMLHttpRequest() 
  : new ActiveXObject("Microsoft.XMLHTTP");
  // 将对象格式的参数转为 urlencoded的格式
  var pairs = [];
  for (var k in params) {
    pairs.push(k + "=" + params[k]);
  }
  var str = pairs.join("&");
  // 判断是否是 get 方法,需要更改 url 的值
  if (method === "GET") {
    url += "?" + str;
  }
  // 创建打开一个连接
  xhr.open(method, url);
  var data = null;
  // 如果是 post 方法,需要设置请求头,还有请求体
  if (method === "POST") {
    xhr.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
    data = str;
  }
  xhr.send(data);
  // 执行回调函数
  xhr.onreadystatechange = function () {
    if (this.readyState !== 4) return;
    // 执行外部传进来的回调函数即可
    // 需要用到响应体
    done(JSON.parse(this.responseText));
  }
}
// 调用函数
ajax("GET", "http://localhost:3000/users",{"id": 1},function (data) {
  console.log(data);
});
ajax("POST", "http://localhost:3000/users",{"name": "john","age": 19,"class": 2},function (data) {
  console.log(data);
});

jQuery中ajax

$.ajax()

  • url: 请求地址
  • type: 请求方法,默认为get
  • dataType: 服务端响应数据类型
  • contentType: 请求体内容类型,默认application/x-www-form-urlencoded
  • data: 需要传递到服务端的数据
  • timeout: 请求超时时间
  • beforeSend: 请求发起之前触发
  • success: 请求成功之后触发
  • error: 请求失败触发,比如请求地址错误
  • complete: 请求完成触发
    $.ajax({
      url: "http://localhost:3000/posts",
      type: "get",
      dataType: "json",
      // data: {"id": 1},
      beforeSend: function(xhr){
        console.log("before send");
      },
      success: function(data){
        console.log(data);
      },
      complete: function(xhr){
        console.log(xhr.status)
      }
    })
    

$.get()

  • get请求的快捷方式
  • $.get(url,data,callback)
    $.get("http://localhost:3000/posts",{},function(data){
      console.log(data)
    })
    

$.post()

  • post请求的快捷方式,添加数据的方式
 $.post("http://localhost:3000/posts",{"name": "dxa"},function(data){
   console.log(data)
 })

其他数据类型

// put 请求,更改数据
$.ajax({
  url: "http://localhost:3000/comments/4",
  type: "put",
  dataType: "json",
  data: {"content": "good", "postId": 2},
  success: function (data) {
    console.log(data)
  }
})
// delete 请求,删除数据
$.ajax({
  url: "http://localhost:3000/comments/5",
  type: "delete",
  success: function (data) {
    console.log(data)
  }
})

Axios

Axios API

  • 可以通过向axios()传递相关配置来创建请求
  • axios(config) config为对象格式的配置选项
  • axios(url,config) config可选

常用配置选项

  • url 用于请求服务器的URL
  • method 创建请求时使用的方法
  • baseURL 传递相对URL前缀,将自动加在url前面
  • headers 即将被发送的自定义请求头
  • params 即将与请求一起发送的URL参数
  • data 作为请求主体被发送的数据
  • timeout 请求超时的毫秒数
  • responseType 表示服务器响应的数据类型,默认json
    axios({
      url: "/posts",
      method: "get",
      baseURL: "http://localhost:3000",
      params: {
        id: 1
      }
    }).then(function(res){
      console.log(res.data)
    })
    

全局默认配置

  • 可以指定将被用在各个请求的配置默认项
  • 利用axios.defaults修改全局变量
    // 全局配置默认值
    axios.defaults.baseURL = "http://localhost:3000";
    

onload/onprogress

  • xhr.onload事件:只在请求完成时触发
  • xhr.onprogress事件: 只在请求进行中触发
var xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:3000/posts");
xhr.onload = function () {
  console.log("load",this.readyState)
}
xhr.onprogress = function (e) {
  console.log("progress",this.readyState)
  // 在周期性请求过程中,接收到的数据的个数
  console.log(e.loaded);
  // 接收数据的总个数
  console.log(e.total);
}
xhr.send(null);

response属性

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

推荐阅读更多精彩内容