数据交互
ajax: 原理必须要能说出来流程即可。
jquery_ajax。 我们promise要结合它
Promise + async函数的
前端的主要工作:1. 画页面、2. 请求ajax (后端给你接口和说明书)
有node环境和mysql环境。工作中就不需要搭建mysql环境了。
0.搭建后端接口项目
-
环境
node + mysql( phpstudy )
-
打开phpstudy启动mysql
-
使用navicate导入数据库
-
先创建一个数据库( xiaou_shop )
-
导入 shop_db.sql
-
-
修改代码的数据库配置文件
-
npm start 启动项目
http://localhost:3000/api/getcate
能出来内容就代表后端接口搭建完成 。
一.axios简介
网址:
axios中文网|axios API 中文文档 | axios
axios是一个基于Promise的http库,支持浏览器端和node.js端
-
从浏览器中创建
XMLHttpRequests
-
从 node.js 创建
http
请求 -
支持
Promise
API -
拦截请求和响应
-
转换请求数据和响应数据
-
取消请求
-
自动转换 JSON 数据
-
客户端支持防御
XSRF
二.安装及配置
-
npm
npm i axios -S
三.跨域
只要前端向服务器发ajax请求,大概会发生跨域。
很多种方案触发:99%都是后端解决的。
-
cors 后端
-
修改服务器代理配置
-
jsonp(用的很少)
四.配置代理解决跨域: 仅是开发阶段而已
项目目录中u-shop/
vue.config.js
文件,这是vue脚手架的配置文件
module.exports = { //设置代理请求 devServer:{ proxy:{ "/api":{ target:"http://localhost:3000",//目标地址 "^/api":"" } } } } //设置代理请求 同一个项目配置多个地址 module.exports = { devServer: { proxy: { "/api1": { // 这是以/api开头的 target: "http://localhost:3000",//目标地址 ,vue脚手架会帮我们转发到这个地址 pathRewrite: { '^/api1': '/apiv1' // 这种接口配置出来 http://XX.XX.XX.XX:3000/api/login } }, "/api2": { // 这是以/api开头的 target: "http://localhost:3000",//目标地址 ,vue脚手架会帮我们转发到这个地址 pathRewrite: { '^/api2': '/apiv2' // 这种接口配置出来 http://XX.XX.XX.XX:3000/api/login } } } } } //一个项目中只有一个接口地址 module.exports = { //设置代理请求 devServer: { proxy: { "/api": { // 这是以/api开头的 target: "http://localhost:3000",//目标地址 ,vue脚手架会帮我们转发到这个地址 } } } } 重启项目: npm run serve
五.axios请求方式
-
get方式
axios.get( url?key=value ) axios.get( url ,{ params:{ } } ) axios.get("http://localhost:3000/api/getcates") .then(function(response) { //成功的回调 console.log(response,'ok'); //接口返回的数据在 response.data中。因为axios库把返回数据和请求的数据进行了二次包装 }) .catch(function(error) { //失败的回调 console.log(error); });
-
post方式
axio.post( url,{ 参数 } ) let result = await axios.post(api_url + "/api/register",{ phone:'15811111112',password:'123456',nickname:'鲁班' });
-
axios
-
get
let result = await axios({ url: api_url + "/api/getgoodsinfo", method: "get", params: { //parmas是axios方法决定的 id: 2 //这个参数是根据后端的接口文档来的 } });
-
post
let result = await axios({ url: api_url + "/api/register", method: "post", data: { phone: "15811111113", password: "123456", nickname: "鲁班小号" } });
-
返回结果的解释
{ config,前端发送ajax的请求头相关的所有配置信息 data,接口返回的内容 headers,如果需要设置请求头需要在这里设置,{ authorization:token字符串 } status,状态码 statusText,状态码对应描述 request,原生ajax的内容 }
baseURL
六.axios的基本应用
6-1get请求
-
局部引入
在某一个具体的.vue页面中引入axios
-
全局引入
在main.js中引入axios挂载到Vue的原型链上
import axios from 'axios' Vue.prototype.$axios = axios 在其它.vue页面可以通过this实例访问到 $axios方法。this.$axios async request1(){ // console.log( this.$axios ) let result = await this.$axios({ url: api_url + "/api/getgoodsinfo", method: "get", params: { //parmas是axios方法决定的 id: 2 //这个参数是根据后端的接口文档来的 } }); console.log(result, "$axios"); }
全局默认设置
axios.defaults.baseURL = 'http://localhost:3000';
七.axios.create() 了解
axios() 其实就是一个http请求的实例对象
axios.create可以用来自定义axios请求,相当于我们又封装了一个ajax方法
let http = axios.create({ baseURL: "http://localhost:3000" }); http({ url: "/api/getgoodsinfo", method: "get", params: { //parmas是axios方法决定的 id: 2 //这个参数是根据后端的接口文档来的 } })
八.执行多个并发请求
function getCates() { return axios.get(api_url + '/api/getcates'); } function getBanner() { return axios.get( api_url + '/api/getbanner' ); } axios.all( [getCates(), getBanner()] ) .then(axios.spread( (cates, banner)=> { // 两个请求现在都执行完成 console.log( cates, banner,'----多并发' ) }));
九.axios拦截器
总结:统一加些操作。比如:
每次打印一上请求地址、响应的结果
每次请求统一加上token
-
请求拦截器
// 请求拦截器 axios.interceptors.request.use(config=>{ return config })
<template> <div> <h2>拦截器</h2> <button @click="request1">发送请求</button> </div> </template> <script> import axios from 'axios' let api_url = 'http://localhost:3000' //1. 响应拦截 axios.interceptors.response.use( res=>{ //console.log(res,'响应拦截') console.group('-------------------------') console.log('本次请求地址为:' ,res.config.url) console.log('本次结果为:',res.data) console.groupEnd('-----') return res //否则后面拿不到结果 } ) //2. 请求拦截,可以统一设置请求的参数,比如统一在headers中加token //假设后端的所有接口要求 前端必须通过headers传递一个aa参数为123 axios.interceptors.request.use( config=>{ // console.log(config,'请求拦截') //config.headers.aa = 1234 config.headers.authorization = 'tokenstring' //登录成功后设置了token字符串到locastorage,从缓存中获取的 return config //必须return,否则请求信息不会发送给服务器 } ) export default { methods:{ async request1(){ let result = await axios.get(api_url + '/api/getcates'); //console.log(result,'request1触发了') }, async request2(){ } } } </script> <style> </style>
-
响应拦截器
// 响应拦截器 axios.interceptors.response.use(res=>{ return res }) axios.interceptors.response.use( res=>{ // console.log(res,'响应拦截') console.group('-------------------------') console.log('本次请求地址为:' ,res.config.url) console.log('本次结果为:',res.data) console.groupEnd('-----') return res //否则后面拿不到结果 } )
十.请求层的封装
-
get请求
let get = ( url,params = {} )=>{ return axios.get( url,{ parmas } ) }
-
封装post 请求
let post = ( url , parmas = {} )=>{ return axios.post( url,parmas ) }
你们公司的项目可能过半年或一年,页面风格要变。但是?万一接口地址变了呢?
之前上线了一版,半年后风格变了又一版,当接口地址变了,那么之前的html页面的地址就都不对了。所以也要对前端中具体的页面中调用的接口也要统一一个封装。
-
api.js
实战
-
注册
-
登录