1.axios是什么?
XMLHttpRequest
get/head/delete/opations/post/put/patch
==方法。2.axios中GET系列的使用方法?
首先需要导入axios对应插件:
npm i axios <script src="node_modules/axios/dist/axios.min.js"></script>
get方法的创建:axios.get([url],[config])
;对应的delete/head/opations方法都是用下面规范
[url]:放我们请求资源的对应接口路径,不带参数
"http://127.0.0.1:8080/user/list"
[config]:用来配置请求信息,是一个对象类型,每个属性按照键值对的形式配置,常用8个。
baseUrl:[string]
:配置请求地址的前缀params:[string/object]
:属性值可以是字符串可以是对象
headers:[object]
:属性值是对象类型,作用同ajax中的xhr.setRequestHeader()
headers:{"Content-Type":application/json}
:但是在get跟Post中,Content-Type属性一般不需要咱们手动改headers:{"Name":"sjh"}
:可以通过headers给请头添加我们想传的数据timeout:[number]
:请求超时时间,数字类型但为是mswithCredentials:[boolean]
:默认为false,true:表示允许跨域携带资源凭证,false:表示不允许responseType:[string]
:把服务器返回的结果转为对应的数据格式,默认是json
(服务器返回的结果,我们都把它转为json对象),还有其他类型:‘arraybuffer/blob/document/json/text/strem’;onUploadProgress:[function]
:监听文件上传进度validateStatus:[function]
:里面是一个函数,函数中的return可以配置status
决定状态值在什么范围才算请求成功,默认2xx为请求成功3.axios中POST系列的使用方法?
首先需要导入axios对应插件:
npm i axios <script src="node_modules/axios/dist/axios.min.js"></script>
axios中post的创建方式:axios.post([url],[data],[config])
;对应的put/patch方法
post常配置的配置项:
transformRequest:function([data],[headers]){return xxx}
:POST请求专用的方法,对请求主体进行格式处理
axios中POST请求的请求主体:
4.axios内部做的优化?
5.对象分为几大类?
6.axios做get请求时存在的三种错误情况?
timeout
:请求超时或被中断,没有状态码,有code属性:code:"ECONNABORTED" response:undefined
navigator.onLine=false
(断网)时:没有状态码,也没有code和response,只能用navigator.onLine=false
判断。7.axios的get和post请求另一种写法?
axios({ method: 'get', url:'http://127.0.0.1:9999/user/list', params:{id:1},//重点,get方法中用params headers:{} }).then(res=>{ console.log(res); }) axios({ method: 'post', url:'http://127.0.0.1:9999/user/list', data:{id:1},//重点,post方法中才能有data headers:{} }).then(res=>{ console.log(res); })
8.axios二次封装?
提取公共配置:axios的二次封装就是将所有请求的公共部分提取到一个默认的js文件中,所有的请求都会遵循这个默认配置文件。
默认配置:axios.defaults.xxx;->xxx:是能够配置的配置项,如timeout
axios.defaults.baseURL = 'http://127.0.0.1:9999';//设置公共 前缀路径 axios.defaults.transformRequest = data => {//设置公共 转换请求体格式 if (isPlainObject(data)) return Qs.stringify(data); return data; }; axios.defaults.timeout = 60000;//设置公共 请求超时时间
请求/响应拦截器:axios.interceptors.request/response
单独配置:单独写的请求配置,优先级高于公共配置
9.axios的请求、响应拦截器怎么使用?
基于拦截器进行公共部分提取
请求拦截器:发生在 “配置项准备完毕” 和 “发送请求” 之间
响应拦截器:发生在 “服务器返回结果” 和 “业务代码自己处理 .then” 之间
//请求拦截 axios.interceptors.request.use(config => { // config对象包含的就是准备好的配置项,最后返回啥配置,就按照这些配置发请求 return config; });
//响应拦截:如果成功就将结果返回给用户,如果失败,进行处理再返回 axios.interceptors.response.use(response => { // 请求成功:把响应主体信息返回给业务层去使用 return response.data; }, reason => { // 请求失败:根据不同的失败原因做不同的提示 if (reason && reason.response) { // @1 有返回结果,只不过状态码不对 let {status} = reason.response; switch (+status) {//switch是做===比较 case 403: alert('服务器不爱搭理你~~'); break; case 404: alert('你傻啊,地址都错了~~'); break; case 500: alert('服务器开小差了~~'); break; } } else { // @2 请求超时或者中断 if (reason && reason.code === "ECONNABORTED") { alert('请求超时或者被中断了~~'); } // @3 断网 if (!navigator.onLine) { alert('当前网络出问题了~~'); } } // 统一失败提示处理完,到业务代码处,我们还是要失败的状态,这样才能继续做一些自己单独想做的失败处理 return Promise.reject(reason); });
1.Fetch的使用?
ES6新增的一种API Fetch,是浏览器原生自带的,核心不是XMLHttpRequest,是基于全新的通信机制实现的[本身是基于promise管理的]
用法:
fetch('http://localhost:9999/job/list',{ method:'GET', headers:{},//请求头信息 //必须是字符串 // body:JSON.stringify({id:0})//请求体中的参数,GET/HEAD/OPtions/DELETE方法没有请求体,不能有body }).then(function(response){ console.log(response);//获取的是一个响应信息的对象,看不到真正的响应体 return response.json(); //想要获取响应体的信息,需要调用对应格式的response.xxx()方法 }).then(function(value){ console.log(value); })
注意点:
result
对应数据格式的方法,比如想获取json格式的响应数据:result.json()
/result.text()
/result.formdata()
/…result.json
等格式获取方法只能使用一次,且只能有一种2.axios和Fetch的区别?
params
中,post请求体信息放到data
里url
后面,post请求体信息放在body
里1.如何区分是同源还是跨域?
协议类型、域名、端口号
,完全相同,则表示同源协议类型、域名、端口号
其中一个不一样就称为跨域2.跨域请求在项目中的场景和意义,以及解决跨域的方案?
跨域请求不被允许的原因:【跨域请求就是做通行证】服务器不允许发送请求的地址访问**(origin 源地址)**,Access-Control-Allow-Origin
情景一:开发时候是跨域的,项目在部署上线后是同源的【现在很少了】
情景二:开发和部署的时候都是跨域的:比如将一个项目文件按类型分服务器部署
3.CROS资源跨域共享如何设置跨域请求?
设置允许源 Access-Control-Allow-Origin:
res.header('Access-Control-Allow-Origin', 'http://127.0.0.1:5500'); res.header("Access-Control-Allow-Credentials", true);
*:允许所有源访问,但是由于服务器认为这样不安全,所以不允许外界携带跨域资源凭证访问(如cookie)
“http://127.0.0.1:8080”:指定单一源访问,允许携带