axios发送请求语法

请求参数通常通过 config.params 或直接拼接在 URL 中。

a) axios.get(url[, config])

请求参数通常通过 config.params 或直接拼接在 URL 中。

// 方式1:通过 params 配置项(推荐,会自动进行 URL 编码)
axios.get('/api/user', {
  params: {
    ID: 12345,
    name: 'John Doe'
  }
})

// 方式2:直接拼接 URL
axios.get('/api/user?ID=12345&name=John%20Doe')

b) axios.post(url[, data[, config]])

用于提交数据(例如,创建新资源)。数据作为请求体发送。

// 提交 JSON 数据
axios.post('/api/user', {
  firstName: 'Fred',
  lastName: 'Flintstone'
})
// 提交表单数据 (需要使用 URLSearchParams 或 FormData)
const formData = new FormData();
formData.append('username', 'admin');
formData.append('password', '123456');
axios.post('/api/login', formData, {
  headers: {
    'Content-Type': 'multipart/form-data' // Axios 会自动设置,但显式指定更清晰
  }
});
通用的请求方法 axios(config)

这是最核心、最强大的请求方式。所有别名方法最终都是通过调用这个方法实现的。当你需要高度自定义请求时,应该使用它。

// 发送一个 POST 请求
axios({
  method: 'post', // 请求方法
  url: '/api/user/12345', // 请求 URL
  data: { // 请求体数据
    firstName: 'Fred',
    lastName: 'Flintstone'
  },
  params: { // URL 查询参数
    action: 'update_profile'
  },
  headers: { // 自定义请求头
    'X-Requested-With': 'XMLHttpRequest',
    'Authorization': 'Bearer YOUR_TOKEN_HERE'
  },
  timeout: 5000 // 请求超时时间
})
3. 创建实例 axios.create([config])

当你需要为不同的后端服务或不同配置的请求创建一个“预设”的客户端时,创建实例非常有用。实例拥有与 axios 相同的方法,但会继承创建时指定的配置。

// 创建一个用于访问 JSONPlaceholder API 的实例
const jsonPlaceholderApi = axios.create({
  baseURL: 'https://jsonplaceholder.typicode.com',
  timeout: 5000,
  headers: {
    'Content-Type': 'application/json',
    'Accept': 'application/json'
  }
});

// 使用这个实例发送请求,无需再写完整的 URL
jsonPlaceholderApi.get('/todos/1')

jsonPlaceholderApi.post('/posts', {
  title: 'foo',
  body: 'bar',
  userId: 1,
})

// 创建另一个用于访问私有 API 的实例,带有认证信息
const privateApi = axios.create({
  baseURL: 'https://api.my-private-service.com/v1',
  headers: {
    'Authorization': 'Bearer ' + localStorage.getItem('token')
  }
});
privateApi.get('/user/profile');

二、Axios 核心配置选项

这些配置选项可以在任何请求方法(别名方法、通用方法、实例创建)的 config 对象中使用。

配置项类型默认值描述
urlstring必需用于请求的服务器 URL。
methodstringget请求方法,如 get, post, put, delete 等。
baseURLstring''将自动加在 url 前面,除非 url 是一个绝对 URL。在 axios.create 中设置非常方便。
headersobject{}自定义请求头。常见如 Content-Type, Authorization
paramsobjectnull即将与请求一起发送的 URL 参数。必须是简单对象或 URLSearchParams 对象。Axios 会将其序列化并追加到 URL 后。
dataobject, string, Buffernull作为请求体被发送的数据。适用于 post, put, patch 等方法。
timeoutnumber0 (无超时)请求超时的毫秒数。如果请求时间超过 timeout,请求将被中断。

三、重要补充:拦截器 和 取消请求

1. 拦截器

拦截器允许你在请求或响应被 thencatch 处理之前拦截它们。这对于添加全局逻辑(如认证、错误处理)非常有用。

请求拦截器
// 添加请求拦截器
axios.interceptors.request.use(
  config => {
    // 在发送请求之前做些什么
    // 例如:从 localStorage 获取 token 并添加到请求头
    const token = localStorage.getItem('authToken');
    if (token) {
      config.headers.Authorization = `Bearer ${token}`;
    }
    console.log('Request is being sent:', config);
    return config;
  },
  error => {
    // 对请求错误做些什么
    return Promise.reject(error);
  }
);
响应拦截器
// 添加响应拦截器
axios.interceptors.response.use(
  response => {
    // 对响应数据做点什么
    // 例如:只返回 response.data,简化后续处理
    console.log('Response received:', response);
    return response.data;
  },
  error => {
    // 对响应错误做点什么
    // 例如:统一处理 401 未授权错误
    if (error.response && error.response.status === 401) {
      console.error('Unauthorized, logging out...');
      // 清除 token 并跳转到登录页
      localStorage.removeItem('authToken');
      window.location.href = '/login';
    }
    return Promise.reject(error);
  }
);

一、axios.request() 的基本用法

axios(config)axios.request(config) 在功能上是完全一样的。它们是 Axios 提供的两种等效方式,用于发起一个通用的 HTTP 请求。

axios.request(config) 接受一个配置对象作为参数,并返回一个 Promise,该 Promise 在请求成功时解析为响应对象,在失败时被拒绝。

示例:发送一个 GET 请求
axios.request({
  method: 'get', // 指定请求方法
  url: '/api/user', // 请求的 URL
  params: { // URL 查询参数
    ID: 12345
  }
})
示例:发送一个 POST 请求
axios.request({
  method: 'post',
  url: '/api/user',
  data: { // 请求体数据
    firstName: 'Fred',
    lastName: 'Flintstone'
  },
  headers: {
    'Content-Type': 'application/json'
  }
})

我要是在axios.post中配置param,会把数据拼接到请求url后面吗?

答案是:不会。 如果你直接在 axios.post 中配置 params 参数,这些数据不会被拼接到请求 URL 后面,而是会被忽略

http.js数据处理

js
/**
 * options = {};
 * options.token = ''; // 存储 token 信息
 * options.config = {}; // axios 配置
 */
-->输入参数:
let params = {
          'token': token,
          'config': {
            'timeout': 25000
          }
      };
this.http = new http(params);
-->构造函数
constructor(options = {})
//配置添加config属性
this.options = this.normalizeOptions(options);
{
    'token': token,
    'config': {
    	'timeout': 25000,
        timeout: 5000,
        withCredentials: true,
    }
};
//token初始化
this.token = this.options.token || "";

-->使用这里的doGet或者doPost方法

//请求拦截器(发送请求前)
//使用normalizeRequestInterHandler配置请求头(鉴权参数、token等)
//实际上并没有具体配置,调用的时候没有提供options
normalizeRequestInterHandler(config, options) {
config.headers = assign(config.headers, options || {});}
//发送请求得到响应之后
-->成功 code=0
	listener.onSuccess
-->响应,但 code!=0
	加入缓存
-->异常
    listener.onFailed


// setToken(token)函数触发
-->更新缓存token信息
setUpdateChacheTokenHandler

//外部调用
// 重新发送缓存中的请求
restartCachedRequest()
// cancel缓存中的请求
cancelCachedRequest()

HttpApi

js
//构造函数
constructor(bizcode, password){
    //构建配置
    let params = {
      'token': token,
      'config': {
        'timeout': 25000
      }
    };
  // 设置请求拦截方法(这里没处理)
  this.http.setRequestInterceptors(this.generateRequestInterceptor.call(this));
  
  // 设置普通业务请求错误是否缓存处理
  //code!==0的情况对response处理(决定是否缓存或者错误)
  //鉴权失败(由于时间相关问题)和token过期都允许请求加入缓存
  this.http.setNormalizeResponseHandler(this.errorInterceptionHandler.call(this));
    //时间问题->更新timeDifference,这样在请求拦截中就能得到更新请求头
    //token过期问题
    //token过期且当前没有正在更新token时,更新token
    
  // 设置axios请求异常处理
  this.http.setNormalizeAbnormalHandler(this.axiosErrorDeal);
}

新请求拦截

js
generateRequestInterceptor() {
      return async config => {
        // let Nonce = generateNonce(8);
        let netAuth = new networkAuth(this.bizcode, this.password, timeDifference).make();
//netAuth结构
{
  authguid: authguid,
  authtimestamp: authtimestamp,
  authbizcode: this.bizcode,
  // authtokenOrigin: authtokenOrigin,
  authtoken: authtoken
};
	//添加属性成为鉴权头(还有公共头部信息)
        const realHeaders = assign(netAuth || {}, { sucUserToken: token }, this.commonHeader || {});
     
        // todo 暂时去除请求头鉴权
        // config.headers = assign(config.headers, realHeaders);

        // config.headers['interfaceSignKey'] = await setreQheader(config, token, Nonce);
        // config.headers['nonce'] = Nonce;
        return config;
      };
    }

总结:

js
-->构造函数调用
//配置http参数
this.http = new http(params);
// 设置普通业务请求错误是否缓存处理
this.http.setNormalizeResponseHandler(this.errorInterceptionHandler.call(this));
// 设置axios请求异常处理(异常翻译器)
this.http.setNormalizeAbnormalHandler(this.axiosErrorDeal);

//主动调用更新token
//更新成功->pinia用户存储token改变->缓存请求换token
updateToken()

//doGet || doPost
params.token = token;
//为请求参数配置添加token 这个是在数据方面添加的

//提供工具:
/**
 * 获取url指定参数
 * @param {String} name: 目标参数
 * @return {String || null} token
 * */
function getUrlOneParam(name)
export const getUrlStr = getUrlOneParam;
/**
 *  获取url中的token
 */
function getToken1()
export const getToken = getToken1;

httpService

js
//httpService是一个对象

httpApi: new HttpApi('0001', 'iflytek!@#123student')
//响应体json化处理 封装
doGet(url, params, listener)
//未处理
doPost(url, params, listener)
//模仿axios method =  | |
promiseDoRequest(url, params, method)
dealResponse(response) {
    const result = response.result;
    try {
      return typeof result === 'string' ? JSON.parse(result) : result;
    } catch (error) {
      return result;
    }
  },

评论

评论加载中……