前言

在对接接口的时候时常会有传参问题调调试试很多,是 JSON、From Data还是 URL 传参,没有搞清楚就浪费很多时间。

本文中就结合 axios 来说明这些的区别,以便在以后工作更好对接。

一、传参区别

在 axios 的源码中对参数的处理分为两类,一类是:get、delete 等,一类是:post、put 等。

// 路径:node_modules\axios\lib\core\Axios.js
utils.forEach(['delete', 'get', 'head', 'options'], function forEachMethodNoData(method) {
Axios.prototype[method] = function(url, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url
}));
};
}); utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
Axios.prototype[method] = function(url, data, config) {
return this.request(utils.merge(config || {}, {
method: method,
url: url,
data: data
}));
};
});

上面的代码在(node_modules\axios\lib\core\Axios.js),从上面可以看出来,get 等在这里是没有参数的,post 等是 data 参数。

1、这里的 get 的参数怎么没有了呢?

在这个地方,get 的参数 params 已经拼接到了 URL 上面,是在初始化 request config 的时候就已经拼接。

// 路径:node_modules\axios\lib\core\Axios.js
config = utils.merge(defaults, {method: 'get'}, this.defaults, config);
// 路径:node_modules\axios\lib\defaults.js
adapter: getDefaultAdapter()
function getDefaultAdapter() {
  var adapter;
  if (typeof XMLHttpRequest !== 'undefined') {
    // For browsers use XHR adapter
    adapter = require('./adapters/xhr');
  } else if (typeof process !== 'undefined') {
    // For node use HTTP adapter
    adapter = require('./adapters/http');
  }
  return adapter;
}
// 路径:node_modules\axios\lib\adapters\http.js
 var options = {
path: buildURL(parsed.path, config.params, config.paramsSerializer).replace(/^\?/, ''),
method: config.method,
headers: headers,
agent: agent,
auth: auth
};

上面的代码是截取自源码中的,最后一段代码就是把 params 拼接到 URL 中。

二、post 传参和 Content Type

在这里拿 post 请求作为示例,看一看是怎么处理 data 数据的。

1、post 默认 Content Type

从源码中可以看出,默认的 Content Type 是:application/x-www-form-urlencoded


// 路径:node_modules\axios\lib\defaults.js
var DEFAULT_CONTENT_TYPE = {
'Content-Type': 'application/x-www-form-urlencoded'
}; utils.forEach(['post', 'put', 'patch'], function forEachMethodWithData(method) {
defaults.headers[method] = utils.merge(DEFAULT_CONTENT_TYPE);
});

所以在不指定的时候,是用 FromData 传参。

2、data 处理

data 的处理过程中会影响 Content Type 。

根据 data 的不同类型,处理也不一样。

// 路径:node_modules\axios\lib\defaults.js
transformRequest: [function transformRequest(data, headers) {
normalizeHeaderName(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;
}
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;charset=utf-8');
return JSON.stringify(data);
}
return data;
}],

上面是源码中对 data 的转换;

有两个特殊处理的类型,URLSearchParams 和 Object,这两个特殊处理会修改 Content Type。

所以有时候,post 请求传的是 params 也是可以,这是因为接口也支持这种传参,没有限定使用 body。

当 data 是 Object 的时候,会把参数格式化为 JSON 字符串。

总结

1、从上面可以看出来,在使用 JSON 传参的时候,直接传一个对象就可以,不用做任何的操作,axios 都在内部做了(现在看来在外面再格式化是多此一举)。

要使用 FormData 的时候,可以单独对数据处理:

      let formData = new FormData();
for(var key in this.formMess){
formData.append(key,this.formMess[key]);
}

再传入 data ,这样里面也不会做处理了,直接返回就可以用,而且 Content Type 也和默认的匹配。

2、要在 get 中传 Object 怎么办?

这个在上一篇文章有说,现在再回头看看,用 post 也可以达到目的。

既然为对 post get 做了区别对待,这样随意乱用不太好,还是 paramsSerializer 更合理。

vue 中 axios 使用的更多相关文章

  1. vue中Axios请求豆瓣API数据并展示到Swipe中

    vue中Axios请求豆瓣API数据并展示到Swipe中 1.首先是安装Axios: 安装方法cnpm install axios --save 等待npm安装完毕: 2.在main.js中引入axi ...

  2. vue中axios的深入使用

    如上所示一条简单的请求数据,用到了vue中axios,promise,qs等等 这里我将vue中用到的axios进行了封装方便日后使用  先对工具类进行封装utils/axios.js: // 引入模 ...

  3. 聊聊 Vue 中 axios 的封装

    聊聊 Vue 中 axios 的封装 axios 是 Vue 官方推荐的一个 HTTP 库,用 axios 官方简介来介绍它,就是: Axios 是一个基于 promise 的 HTTP 库,可以用在 ...

  4. Vue中axios的封装和api接口的统一管理

    更新的是我csdn上的文章,需要的话可以看下,互相学习点击去我的csdn vue中axios的封装 在vue项目和后端交互获取数据时,通常使用axios库,官方文档:https://www.npmjs ...

  5. vue中axios使用二:axios以post,get,jsonp的方式请求后台数据

    本文为博主原创,转载请注明出处 axios在上一篇中讲过:vue中axios使用一:axios做拦截器,axios是请求后台资源的模块,用来请求后台资源. axios本身是支持get,post请求后台 ...

  6. vue中axios的安装使用

    axios是一个基于 promise 的 HTTP 库,在vue中axios是比较常用的网络请求方法. 安装 npm install axios -S 在main.js配置 import axios ...

  7. vue中axios 配置请求拦截功能 及请求方式如何封装

    main.js 中: import axios from '................/axios' axios.js 中: //axios.js import Vue from 'vue' i ...

  8. vue 中axios 的基本配置和基本概念

    axios的基本概念及安装配置方法   ajax:异步请求,是一种无需再重新加载整个网页的情况下,能够更新部分网页的技术 axios:用于浏览器和node.js的基于promise的HTTP客户端 a ...

  9. vue中Axios的封装和API接口的管理

    前端小白的声明: 这篇文章为转载:主要是为了方便自己查阅学习.如果对原博主造成侵犯,我会立即删除. 转载地址:点击查看 如图,面对一团糟代码的你~~~真的想说,What F~U~C~K!!! 回归正题 ...

  10. 初步使用vue中axios

    1.下载axios npm install axios --save 2.两种方式使用axios (1)在模块中引入axios 例如:我在用户登陆界面需要使用axios,就在login页面引入,不是全 ...

随机推荐

  1. (CSDN迁移)JAVA多线程实现-继承Thread

    继承Thread方法: extends Thread 重写覆盖run()方法: @Override public void run() 通过start()方法启动线程. threadDemo01.st ...

  2. find和grep的使用

    1.find命令的使用 在Linux中可以使用find命令在指定的目录下查找文件.任何位于参数之前的字符串都将被视为欲查找的目录名,当使用该命令时,不设置任何参数,则find命令将在当前目录下查找子目 ...

  3. 【LOJ502】[LibreOJ β Round] ZQC 的截图 (随机化)

    真的是神仙题目啊-- 题目 LOJ502 官方题解 我认为官方题解比我讲得好. 分析 这是一道蒙特卡洛算法的好题 上面那个奇奇怪怪的词是从官方题解里看到的,意思大概就是随机化算法 -- ? 一句话题意 ...

  4. LeNet-5 卷积神经网络结构图

    LeNet-5是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一.可以说,Le ...

  5. js获取当前时间,格式YYYY-MM-DD

    //获取当前时间,格式YYYY-MM-DD function getNowFormatDate() { var date = new Date(); var seperator1 = "-& ...

  6. TCP Socket 套接字 和 粘包问题

    一.Scoket 套接字 Scoket是应用层(应用程序)与TCP/IP协议通信的中间软件抽象层,它是一组接口.也可以理解为总共就三层:应用层,scoket抽象层,复杂的TCP/IP协议 基于TCP协 ...

  7. Equalizing Two Strings CodeForces - 1256F (思维)

    大意: 给定两个串$s,t$, 每次操作任选长度$len$, 分别翻转$s,t$中一个长$len$的子串, 可以进行任意次操作, 求判断能否使$s$和$t$相同. 字符出现次数不一样显然无解, 否则若 ...

  8. Java 随机数生成工具RandomUtils

    RandomUtils /** * <html> * <body> * <P> Copyright 1994 JsonInternational</p> ...

  9. 在ASP.NET MVC中加载部分视图的方法及差别

    在视图里有多种方法可以加载部分视图,包括Partial() .Action().RenderPartial().RenderAction().RenderPage()方法.下面说明一下这些方法的差别. ...

  10. 测度(Measure)

    测度概述 数学上,测度(Measure)是一个函数,它对一个给定集合的某些子集指定一个数,这个数可以比作大小.体积.概率等等.传统的积分是在区间上进行的,后来人们希望把积分推广到任意的集合上,就发展出 ...