defaults(默认配置)和mergeConfig(合并config方法)
axios学习笔记defaults(默认配置)和mergeConfig(合并config方法)
找到入口文件
axios/lib/axios.js
...
var mergeConfig = require('./core/mergeConfig');`
var defaults = require('./defaults')`
...
学习mergeConfig
axios/lib/core/mergeConfig.js
var utils = require('../utils')//引入公用方法
// 合并 config1 和config2,并将一些默认配置项放到config中
function mergeConfig(config1, config2) {
config2 = config2 || {};
var config = {}
//默认配置参数字段
//从config2中拿到config里的字段
var valueFromConfig2Keys = ['url', 'method', 'params', 'data'];
//合并config1和config2中的这些字段,config2优先
var mergeDeepPropertiesKeys = ['headers', 'auth', 'proxy'];
// 从config2中拿到default的字段
var defaultToConfig2Keys = [
'baseURL', 'url', 'transformRequest', 'transformResponse', 'paramsSerializer',
'timeout', 'withCredentials', 'adapter', 'responseType', 'xsrfCookieName',
'xsrfHeaderName', 'onUploadProgress', 'onDownloadProgress',
'maxContentLength', 'validateStatus', 'maxRedirects', 'httpAgent',
'httpsAgent', 'cancelToken', 'socketPath'
];
//将config2中valueFromConfig2Key里存在的项复制config对象里
utils.forEach(valueFromConfig2Keys, function valueFromConfig2(prop){//prop为valueFromConfig2Keyd中的具体每项的值
if(typeof config2[prop] !== 'undefined'){
config[prop] = config2[prop];
}
})
utils.forEach(mergeDeepPropertiesKeys, function mergeDeepProperties(prop){
if(utils.isObject(config2[prop])){//如果config2[prop]为对象,进行深度合并
config[prop] = utils.deepMerge(config1[prop], config2[prop]);//此处确保了config1[prop]的存在
} else if(typeof config2[prop] != 'undefiend') {//config2[prop]存在且不为对象,直接赋值
config[prop] = config2[prop];
} else if(utils.isObect(config1[prop])){//config2[prop]不存在但config1[prop]存在且为对象
config[prop] = utils.deepMerge(config1[prop]);
} eles {//config2[prop]不存在且config1[prop]不为对象
config[prop] = config1[prop];
}
})
// 从config2中拿到default的字段,如果没有去config1中拿字段
utils.forEach(defaultToConfig2Keys, function defaultToConfig2(prop){
if(typeof config2[prop] !== 'undefined'){
config[prop] = config2[prop];
} else {
config[prop] = config1[prop]
}
})
//合并所有关键字
var axiosKeys = valueFromConfig2Keys.concat(mergeDeepPropeotiesKeys).cancat(defaultToConfig2Key2);
//找出存在config2中不同于默认配置项的项,并加到config上去
var otherKeys = Object.keys(config2).filter(function filterAxiosKeys(key){
return axiosKeys.indexOf(key) === -1
});
utils.forEach(otherKey2, function other(prop){
if(typeof config2[prop] !== 'undefined' || typeof config1[prop] !== 'undefined'){
config[prop] = config2[prop] || config1[prop];
}
})
//返回拼接后的对象
return config;
}
default默认配置
<!-- 默认配置依赖normalizeHeaderName -->
var utils = require('./utils');
var normalizeHeaderName = require('./helpers/normalizeHeaderName');
...
normalizeHeaderName方法
先看normalizeHeaderName方法,默认配置中使用到此方法
var utils = require('../utils')
module.export = function normalizeHeaderName(headers, normalizedName) {
//转化headers中的键值名,如果headers中的键值不等于normalizedName,且字母相同,将heders中的键值换成normalizedName
utils.forEach(heders, function processHeader(value, name){
if(name !== normalizedName && name.toUpperCase() === normalizedName.toUpperCase()){
headers[normalizedName] = value;//添加新键值对
delete headers[name]; //删除原有键值对
}
})
}
配置默认的Content-Type
请求头content-type,用来指定不同格式的请求信息
mediaType,互联网媒体类型,在http协议消息头中,使用content-type表示具体请求中的媒体类型信息
<!--
常见的媒体格式
text/html:html格式
application/json: json格式
application/x-www-form-urlencoded: (表单默认提交数据格式)<form encType="">中默认的encType,form表单中的数据被编码为key/value格式发送到服务器
multipart/form-data: 需要在表单中进行文件上传时设置此格式
-->
var DEFAULT_CONTENT_TYPE = {//默认的Content-Type
'Content-Type': 'application/x-www-form-urlencoded'
}
setContentTypeIfUnset方法
当没有配置Content-Type时设置headers中Content-Type的值
function setContentTypeIfUnset(headers, value){//value为需要设置的Content-Type的值
//当headers存在且heders[Content-Type]不存在
if(!utils.isUndefined(headers) && utils.isUndefined(headers['Content-Type'])){
headers['Content-Type'] = value;
}
}
getDefaultAdapter方法
获取默认的异步请求适配器,由于axios支持浏览器环境和node环境两套环境,两套环境需要不同的适配器
function getDefaultAdaptet(){
var adapter;
if(typeof XMLHttpRequest !== 'undifined'){//当前环境支持XMLHttpRequest对象为浏览器环境
adapter = require('./adapter/xhr');
} else if(typeof process !== 'undefined' && Object.property.toString.call(process) === '[object process]'){//当前环境支持process对象为node环境
adapter = require('./adapter/http');
}
}
定义默认default对象
var default = {
adapter: getDefaultAdapter(),//默认异步请求适配器,允许自定义处理请求,方便测试
//拦截请求数据默认配置,根据数据类型做一定处理,例如设置Content-type
transformRequest:[function transformRequest(data, headers){
normalizeHederName(headers, 'Accept');//大小写处理,防止用户写错
normalizeHederName(headers, 'Content-Type');
if(utils.isFormData(data) || utils.isArrayBuffer(data) || utils.isBuffer(data) || utils.isStream(data) || utils.isFile(data) || utils.isBlob(data)){
return data;
}
if(utils.isArrayBufferView(data)){
return data.buffer;
}
//根据数据类型设置相应的Content-Type
if(utils.isURLSearchParams(data)){
setContentTypeIfUnset(headers, 'application/x-www-form-urlencoded;charset=utf-8')
return data.toString();
}
if(utils.isObject(data)){
setContentTypeIfUnset(headers, 'application/json;chatset=utf-8')
return JSON.stringify(data);
}
return data;
}],
//拦截响应数据默认配置,根据数据类型做一定处理
transformResponse:[function transformResponse(data){
if(typeof data == 'string'){
try{
data = JSON.parse(data);
}catch(e){
}
}
return data;
}],,
timeout: 0, // 请求超时时长
xsrfCookieName:'XSFR-TOKEN',//表示用作xsrf令牌的值的名称
xsrfHeaderName:'X-XSRF-TOKEN',//表示携带xsrf令牌的值的http头的名称
maxContentLength: -1,定义允许的http响应内容的最大大小
validateStatus: function validateStatus(status){//校验请求返回的状态码,状态码在200-300以内请求成功
return status > 200 && status < 300;
}
}
配置default对象的默认headers
//Accept代表客户希望接受的数据类型,一般情况下服务端会根据accept的值,来决定返回数据的类型,并设置response中Content-type的值
default.headers = {
common: {
'Accept': 'application/json, text/plain, */*',
}
}
给headers加上默认方法
<!-- 添加没有数据的方法 -->
utils.forEach(['delete', 'get', 'header'], function forEachMethodNoData(method){
default.headers[method] = {};
})
<!-- 添加有数据的方法 -->
utils.forEach([post', 'put', 'patch'], function forEachMethodNoData(method){
//post put patch 方法需要传递参数,故需要设置传参默认类型
default.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
})
总结
js设置的Content-Type为http请求头中request中的Content-type,是告诉服务器客户端要发送的数据的格式,get,delete请求默认无
js设置的Accept为http请求头中request字段,告诉服务器客户端希望接受的数据的格式
一般情况下服务端会设置http请求头中response中的Content-type和request中Accept格式一样,告诉客户端服务端返回的数据格式
服务器可以根据Accept选择不同的格式,选择返回不同的格式,也可以不管Accpet
总得来说前端只能设置请求头,响应头只能客户端设置
defaults(默认配置)和mergeConfig(合并config方法)的更多相关文章
- 使用Typescript重构axios(十五)——默认配置
0. 系列文章 1.使用Typescript重构axios(一)--写在最前面 2.使用Typescript重构axios(二)--项目起手,跑通流程 3.使用Typescript重构axios(三) ...
- Asp.net默认配置下,Session莫名丢失的原因及解决
Asp.net默认配置下,Session莫名丢失的原因及解决 我们平时写的asp.net程序,里面要用到Session来保存一些跨页面的数据.但是Session会经常无故丢失,上网查查,也没找到原因. ...
- OpenStack配置解析库oslo.config的使用方法
OpenStack的oslo项目旨在独立出系统中可重用的基础功能,oslo.config就是其中一个被广泛使用的库,该项工作的主要目的就是解析OpenStack中命令行(CLI)或配置文件(.conf ...
- 修改Nodejs内置的npm默认配置路径方法
Nodejs 内置的npm默认会把模块安装在c盘的用户AppData目录下(吐槽一下:不明白为啥现在的软件都喜欢把资源装在这里) C盘这么小,肯定是不行的,下面一步步修改到D盘 1.打开cmd命令行, ...
- 【系统Configmachine.config与自己的应用程序的App.config/Web.Config配置节点重复】解决方法
自己的应用程序的App.config或Web.Config文件中与系统的C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Configmachine.co ...
- Linux重启inotify配置max_user_watches无效被恢复默认值8192的正确修改方法
Linux下Rsync+inotify-tools实现数据实时同步中有一个重要的配置就是设置Inotify的max_user_watches值,如果不设置,当遇到大量文件的时候就会出现出错的情况. 一 ...
- AWS EC2避免误删软件包和数据的方法:取消“终止删除”默认配置
本文介绍AWS在终止实例的时候如何保留根卷,避免误删软件包和数据. 作者:光环云 尹晓征 在aws控制台创建EC2的时候,我们在添加存储步骤中,如果使用默认配置的情况下,“终止时删除”配置默认是被选中 ...
- Axios的默认配置(碎片知识)API
axios API axios(config) axios({ method: 'Post', url: '/user/123', data: { //略 } }) axios(url[, confi ...
- [Python] 项目的配置覆盖与合并
参考来源: https://www.liaoxuefeng.com/wiki/1016959663602400/1018490750237280 代码稍微修改了一下 import os import ...
随机推荐
- SpringBoot自定义注解、AOP打印日志
前言 在SpringBoot中使用自定义注解.aop切面打印web请求日志.主要是想把controller的每个request请求日志收集起来,调用接口.执行时间.返回值这几个重要的信息存储到数据库里 ...
- CATransform3D 特效详解
http://blog.sina.com.cn/s/blog_8f5097be0101b91z.html
- Django restframework 序列化之 ModelSerializer 小记
首先介绍一下相关概念 序列化器(Serializer) 1. 自定义型: 继承rest_framework.serializers.Serializer 2. 模型类型: 继承rest_frame ...
- pandas - groupby 深入及数据清洗案例
import pandas as pd import numpy as np 分割-apply-聚合 大数据的MapReduce The most general-purpose GroupBy me ...
- [TCP/IP] TCP的报文头
1.源端口和目的端口:各占2个字节,分别写入源端口和目的端口: 2.序列号:占4个字节,TCP连接中传送的字节流中的每个字节都按顺序编号.例如,一段报文的序号字段值是 301 ,而携带的数据共有100 ...
- css 文本属性和字体属性
1.将浮动居中 这需要三个盒子 <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- Spring服务发现和注册
- HDU1213:How Many Tables(并查集入门)
-----------刷点水题练习java------------- 题意:给定N点,M边的无向图,问有多少个连通块. 思路:可以搜索; 可以并查集.这里用并查集练习java的数组使用,ans=N, ...
- Android TextField : set focus + soft input programmatically
Good sir, try this: edittext.setFocusableInTouchMode(true); edittext.requestFocus(); Im not sure, bu ...
- Ubuntu下apache2安装配置(内含数字证书配置)
Ubuntu下apache2安装配置(内含数字证书配置)安装命令:sudo apt-get updatesudo apt-get install apache2 配置1.查看apache2安装目录命令 ...