Vue-axios-post数据后端接不到问题解决


Posted in Javascript onJanuary 09, 2020

1 前言

最近在前后端联调的时候发现了一个问题,可能自己平时不注意发送的内容格式,导致解决问题的路上,走了很多弯路,尤其是在刚刚懂了一点Vue知识之后,发送请求的各种花式写法也是让人头大,我在这把我踩到的坑给大家介绍一下吧。

2 问题

这个问题是我前端登录的时候向后端发生post请求。在使用这个接口前,我使用 postman 确认过了几次,接口传参是没有问题的,而且使用params或者body传参都是能接收到的。然而还是报错了……我们先来看看一个截图吧。

Vue-axios-post数据后端接不到问题解决

我向后端发参数的时候无论如何我都接不到数据,然后我就开始各种怀疑和猜测

( a )后端接口问题
如果是后端接口问题,那么我用postman接到了呀,所以这一条虽然我不信,但是我还是去各种尝试修改,我修改的接口传递方式,我怀疑是不是跨域失败,然而都没能解决我的问题。

( b )怀疑跨域未成功
我仔细检查了是否存在全局代理(各种代理工具)
是否存在nodejs本身问题

( c )发送参数问题

我的请求代码如下:

axios.post('/api/home/login',{
     params: {
      username: this.username,
      password: this.password
     }
    }).then(this.handleLoginSucc)

我自认为没有问题,但是又不敢确定,于是我又换了一种写法

// main.js配置
import axios from 'axios'
// 配置请求的根路径
axios.defaults.baseURL = 'http://localhost:8088/caeser/'
Vue.prototype.$http = axios

// 代码调用
// 设置同步方法 async
const{ data: res } await this.$http.post('users', { params: this.queryInfo })

然而并不能解决我的问题,因为发送的内格式依然没有变化。

最后我找了解决办法,而且确定了内容格式是formdata

3 解决办法

3.1 办法1

var params = new URLSearchParams()
// 参数保存
params.append('username', this.loginForm.username)
params.append('password', this.loginForm.password)
// post发送
axios.post('/api/home/login', params).then(this.handleLoginSucc)

这次我就能接到了,我们看看内容格式是什么

Vue-axios-post数据后端接不到问题解决

Content-type依然是application/json,但是数据格式变成了 Form Data,于是问题迎刃而解了。

这个问题困扰了我两天,算是吸取一个教训吧,复习了一下请求方面的知识,算是有所进步了。

3.1.1 兼容性

有个很重要提醒:所有浏览器都不支持URLSearchParams,但是有一个polyfill可用(确保polyfill全局环境)

// 安装
// npm install url-search-params-polyfill --save

ES2015+

import 'url-search-params-polyfill';

3.2 办法2

这个办法我建议使用,因为可以解决兼容性问题
使用qs库对数据进行编码

var qs = require('qs');
axios.post('/foo', qs.stringify({ 'bar': 123 });

使用qs库编码发送请求后端也是可以接收到的。

3.3 办法3

不推荐使用

axios.post(url,{data:{},
 headers:{content-type:'application/x-www-form-unlencoded'}
})

4 Request payload 和 FormData 区别

FormData和Payload是浏览器传输给后端接口的两种内容格式,这两种方式浏览器是通过Content-Type来进行区分的,如果是 application/x-www-form-urlencoded的话,则为formdata方式,如果是application/json或multipart/form-data的话,则为 request payload

下面内容为后端内容

4.1 后端代码如何处理这两种格式

Request payload
对于 Request Payload 请求, 必须加 @RequestBody 才能将请求正文解析到对应的 bean 中,且只能通过 request.getReader() 来获取请求正文内容

Form Data
无需任何注解,springmvc 会自动使用 MessageConverter 将请求参数解析到对应的 bean,且通过 request.getParameter(…) 能获取请求参数

我自己后端代码就是因为没有使用 request.getReader() 来获取,才出现的问题

上面内容为后端内容

5 复习js和jquery的请求

jquery的请求很方便,格式很清晰

$.ajax({
  url : targeturl,
  type : 'POST',
  data : formData,
  contentType : false,
  processData : false,
  cache : false,
  success : function(data) {
    if (data.success) {
      // success
    } else {
      // error
    }
  }
});

JavaScript

function sendData(data) {
 var XHR = new XMLHttpRequest();
 var urlEncodedData = "";
 var urlEncodedDataPairs = [];
 var name;
 // 将数据对象转换为URL编码的键/值对数组。
 for(name in data) {
  urlEncodedDataPairs.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));
 }
 urlEncodedData = urlEncodedDataPairs.join('&').replace(/%20/g, '+');
 // 定义成功数据提交时发生的情况
 XHR.addEventListener('load', function(event) {
  //
 });
 // 定义错误提示
 XHR.addEventListener('error', function(event) {
  //
 });
 // 建立我们的请求
 XHR.open('POST', 'https://example.com/cors.php');
 // 为表单数据POST请求添加所需的HTTP头
 XHR.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
 // 最后,发送我们的数据。
 XHR.send(urlEncodedData);
}

6 Axios知识点

6.1 全局默认值

axios.defaults.baseURL = 'https://caeser.com';
axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

6.2 拦截器

//添加请求拦截器
axios.interceptors.request.use(function(config){
   // before success
   // must return config
   // 必须返回config
   return config;
  }, function(error){
   // error
  })
 
//添加响应拦截器
axios.interceptors.response.use(function(response){
   // 
   return response;
  },function(error){
   // error
  });

或者自定义实体

var instance = axios.create();
instance.interceptors.request.use(function () {/*...*/});

7 总结

在学习vue的过程中是非常容易的,因为vue真的很方便使用,学起来很快,都是模板语法,直接COPY就行了,而且逻辑性很简单,就是在使用的时候,各种版本和插件要学会调试,多尝试多使用,而且为了好好写前端,我都下载了离线的CSS样式文件,因为很多样式我都没背下来,而且很多样式我都不知道,有很多新的好用的特性,都是值得使用的。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
dojo 之基础篇
Mar 24 Javascript
JavaScript动态添加style节点的方法
Jun 09 Javascript
jQuery可见性过滤选择器用法示例
Sep 09 Javascript
React Native实现简单的登录功能(推荐)
Sep 19 Javascript
js中小数向上取整数,向下取整数,四舍五入取整数的实现(必看篇)
Feb 13 Javascript
微信小程序 定位到当前城市实现实例代码
Feb 23 Javascript
vue中关闭eslint的方法分析
Aug 04 Javascript
详解Webpack-dev-server的proxy用法
Sep 08 Javascript
vue实现菜单切换功能
May 08 Javascript
VUEX-action可以修改state吗
Nov 19 Javascript
nuxt 路由、过渡特效、中间件的实现代码
Nov 06 Javascript
对vue生命周期的深入理解
Dec 03 Vue.js
一看就会的vuex实现登录验证(附案例)
Jan 09 #Javascript
Websocket 向指定用户发消息的方法
Jan 09 #Javascript
Vue快速实现通用表单验证的示例代码
Jan 09 #Javascript
JS实现商品橱窗特效
Jan 09 #Javascript
微信小程序实现页面浮动导航
Jan 08 #Javascript
微信小程序基于movable-view实现滑动删除效果
Jan 08 #Javascript
小程序自定义模板实现吸顶功能
Jan 08 #Javascript
You might like
PHP __autoload()方法真的影响性能吗?
2012/03/30 PHP
php中使用__autoload()自动加载未定义类的实现代码
2013/02/06 PHP
用PHP来计算某个目录大小的方法
2014/04/01 PHP
Parse正式发布开源PHP SDK
2014/08/11 PHP
CodeIgniter 完美解决URL含有中文字符串
2016/05/13 PHP
php与c 实现按行读取文件实例代码
2017/01/03 PHP
PHP依赖注入(DI)和控制反转(IoC)详解
2017/06/12 PHP
PHP获取数据库表中的数据插入新的表再原删除数据方法
2018/10/12 PHP
PHP文件操作实例总结【文件上传、下载、分页】
2018/12/08 PHP
[原创]用javascript实现检测指定目录是否存在的方法
2008/01/12 Javascript
node.js中的fs.truncateSync方法使用说明
2014/12/15 Javascript
jquery实现横向图片轮播特效代码分享
2015/11/19 Javascript
jQuery EasyUI菜单与按钮详解
2016/07/13 Javascript
轻松实现jquery选项卡切换效果
2016/10/10 Javascript
JS得到当前时间的方法示例
2017/03/24 Javascript
温故知新——JavaScript中的字符串连接问题最全总结(推荐)
2017/08/21 Javascript
vue的安装及element组件的安装方法
2018/03/09 Javascript
[56:18]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#2 MVP.Phx VS Fnatic第二局
2016/03/05 DOTA
[01:03:41]完美世界DOTA2联赛PWL S3 DLG vs Phoenix 第一场 12.17
2020/12/19 DOTA
Python实现的简单文件传输服务器和客户端
2015/04/08 Python
Python EOL while scanning string literal问题解决方法
2020/09/18 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
2016/06/29 Python
为Python的Tornado框架配置使用Jinja2模板引擎的方法
2016/06/30 Python
Python中Django 后台自定义表单控件
2017/03/28 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
Django在admin后台集成TinyMCE富文本编辑器的例子
2019/08/09 Python
python 下 CMake 安装配置 OPENCV 4.1.1的方法
2019/09/30 Python
K最近邻算法(KNN)---sklearn+python实现方式
2020/02/24 Python
python计算Content-MD5并获取文件的Content-MD5值方式
2020/04/03 Python
Python 转移文件至云对象存储的方法
2021/02/07 Python
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
2014年党务公开实施方案
2014/02/27 职场文书
群众路线党员自我评议范文2014
2014/09/24 职场文书
委托书格式要求
2015/01/28 职场文书
公司档案管理制度
2015/08/05 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书