XMLHttpRequest\ajax\axios

159 阅读3分钟

http接口请求

(优点)与服务器通信,无刷新的获取数据——调用接口;缺点(无浏览历史、跨域问题、SEO不友好-爬虫爬不到)

应用场景:京东的二级菜单,百度的输入提示,注册用户名的校验(都不会刷新页面)、滚动到底发ajax请求新数据

应用方式:js原生写法、jquery、fetch、axios

请求报文

-请求报文

请求行(请求类型Get,url参数、http类型);
请求头(host、cookie:name="gggpf",content-type、user-agent:chrome)
空行
请求体(post请求,请求体可以不为空)

——响应报文

  http1.1类型 请求码200
     content-type: text/html;charset=utf-8
	Content-length: 2048
	Content-encoding: gzip
空行
  /<html/>…</html>

简单express服务

    // 1.引入express
    const express = require('express')
    // 2.创建应用对象
    const app = express()

    // 3.创建路由规则
    app.get('/server', (req, rep)=>{
      rep.setHeader('Access-Control-Allow-Origin', '*')
      rep.send('sensss')
    })
    // 3.创建路由规则(all接受所有类型请求)
    app.all('/serverPost', (req, rep)=>{
      console.log(7777, 'www')
      rep.setHeader('Access-Control-Allow-Origin', '*')
      // 所有头信息都可以接受,包括自定义部分
      rep.setHeader('Access-Control-Allow-Headers', '*')
      rep.send('sensss post')
    })

    app.all('/json-server', (req, rep)=>{
      const data = {
        name: 'ddd', age: '22'
      }
      rep.setHeader('Access-Control-Allow-Origin', '*')
      // 所有头信息都可以接受,包括自定义部分
      rep.setHeader('Access-Control-Allow-Headers', '*')
      rep.send(data)
    })

    // 4.监听端口,启动服务
    app.listen(80, ()=>{
      console.log('listen....')
    })

原生的XMLHttpRequest对象

    Let xhr = new XMLHttpRequest()
    Xhr.open('GET', 'http://127.0.0.1:80/json-server')
    Xhr.send('可以发送自定义响应体')
    Xhr.timeout = 2000
    Xhr.ontimeout = function (){
            Alert('网络超时')
    }
    Xhr.onerror = function (){
            Alert('网络错误')
    }

    xhr请求设置自定义响应体内容(xhr.setRequestHeader('my-type', 'ssdsds'))
    需要再服务端适配(rep.setHeader('Access-Control-Allow-Headers', '*'))

    对于一般的JSON对象数据,设置xhr.responseType="json"即可默认转为对象

    小tip:IE缓存问题解决(在其中加个参数?t=Date.now()),工具一般都会做

XMLHttpRequest mdn文档

详细参数见mdn文档:developer.mozilla.org/zh-CN/docs/… 一个新的api专题(属性、方法、事件 关注),分析应用场景即可

属性,多是一些状态信息,关注访问类型 readyState(只读)\status\statusText、timeout(可读写)

方法,多是与功能相关,open、send、setRequestHeader、getAllResponseHeaders、abort(取消未完成的请求)

事件,多是被触发的状态,onreadystatechange、onerror、ontimeout 对于本专题的返回参数是重点responseType,可取text、json、document、blob、arraybuffer等,需注意与服务端相对

jQuery的ajax请求(jquery中的ajax很多选项,可在jquery文档中查看)

	// 按类别请求-简洁
	$.get(url, {a:100, b:200}, function(data){console.log(data)})   $.post()
	// 通用的ajax请求-通用
	$.ajax({
		url: '',
		type: '',
		data: '请求参数',
		dataType: 'json',
		success: function(data){
			console.log(data)
		},
		timeout: 2000,
		error: function(data){
			console.log(data)
		},
		headers:{
			a: 100,
			b: 200
		}
	})

小tips: bootcdn-设置国内源的cdn(demo测试阶段使用)

axios(基于promise的xmlhttprequest) 一个ts的axios封装: juejin.cn/post/709088…

封装功能

请求通用配置(请求头)-跨域携带cookie、token、超时设置
请求守卫(发送请求、收到报文的通用校验处理-状态码报错等)
全局loading
统一文件处理

最简单实现部分

import axios from 'axios'
// 请求通用配置-跨域携带cookie、token、超时设置  创建axios实例
const service = axios.create({
        //baseURL: 'http://ssss/', // api的base_url
        // 自定义的请求头
        headers: {
                'Content-Type': 'application/json;charset=utf-8',
        },
        // 超时设置
        timeout: 120000,
        // 跨域是否带Token
        withCredentials: false,
        // 响应的数据格式 json / blob /document /arraybuffer / text / stream
        responseType: 'json'
})
// 请求守卫
service.interceptors.request.use(data=>{
    // 做权限校验,或者拿到登录token才能调用接口
    // 做头部字段添加
    data.params = {
        ...data.params,
        login_id: store.getters.userId,
        power_depart_id: store.getters.powerDepartId,
    }
    return data
}, error=>{
    Promise.reject(data)
})
// 响应守卫
service.interceptors.reponse.use(response=>{
    switch (response.data.return_code) {
        case 200 :
                return response.data.data;
        case "451":
                return ''
        }
    return response
}, error=>{
    // 仍可获得状态码 error.response.status
})