Vue使用axios出现options请求方法


Posted in Javascript onMay 30, 2019

以下代码如果需要在你本地跑起来:

Ⅰ.需要apache服务,并把php代码丢进去指定位置

Ⅱ.将下面http://www.test.com/day05/jiekou.php地址,改成自己指定位置的域名或ip

1.从一段简易代码说起

前端代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <!-- 导入axios -->
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</head>

<body>
  <!-- POST 请求 -->
  <form method="post">
    <p>用户名:<input id="username" type="text" name="username" value="admin"> </p>
    <br />
    <p>密 码:<input id="password" type="text" name="password" value="123456"> </p>
    <br />
    <p><input id="btn" type="submit" value="登录" /></p>
  </form>
</body>
<script>

  document.getElementById("btn").onclick = function () {
    //获取用户输入的登录信息
    let username = document.getElementById('username').value;
    let password = document.getElementById('password').value;
    //不处理的数据对象
    let data = {
      username: username,
      password: password
    };
    console.log(data);//{username: "admin", password: "123456"}
    //阻止submit默认行为:表单提交刷新页面
    event.preventDefault();
    //提交请求获取响应数据
    axios.post("http://www.test.com/day05/jiekou.php", data).then(res => {
      console.log(res);
    }).catch(err => {
      console.log(err);
    })

  }
</script>
</html>

php接口代码

<?php

// 制定允许其他域名访问
header("Access-Control-Allow-Origin:*");
// 允许的响应类型
header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH');
// 响应头设置
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");

// 获取form表单值
$username = $_POST['username'];

$password = $_POST['password'];

// 判断form表单中key
if(isset($_POST['username']) && isset($_POST['password'])){
  // 判断username和password
  if($username == "admin" && $password == "123456"){
    
    $result = array("success" => 1, "code" => 101, "data" => array("username" => $username, "password" => $password));  
  
  }else{
    $result = array("success" => 0, "code" => 103, "data" => null);
  }
  
}else{
  $result = array("success" => 0, "code" => 100, "data" => null);
}
// 将错误信息(数组)转换成json类型,返回前端
echo(json_encode($result));
?>

结果:运行失败,无法获取响应数据

Vue使用axios出现options请求方法

2.解决:

方法Ⅰ.引入qs模块处理数据:修改上面的html代码

<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <!-- 导入axios -->
  <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  <!-- 导入qs -->
  <script src="https://cdn.bootcss.com/qs/6.5.2/qs.min.js"></script>
</head>

<body>
  <!-- POST 请求 -->
  <form method="post">
    <p>用户名:<input id="username" type="text" name="username" value="admin"> </p>
    <br />
    <p>密 码:<input id="password" type="text" name="password" value="123456"> </p>
    <br />
    <p><input id="btn" type="submit" value="登录" /></p>
  </form>
</body>
<script>

  document.getElementById("btn").onclick = function () {
    //获取用户输入的登录信息
    let username = document.getElementById('username').value;
    let password = document.getElementById('password').value;
    // 用qs处理数据对象
    //qs的原理:就是将对象转变成字符串拼接到url上再发post请求
    let data = Qs.stringify({
     username: username,
     password: password
    });
    console.log(data);//username=admin&password=123456
    //阻止submit默认行为:表单提交刷新页面
    event.preventDefault();
    //提交请求获取响应数据
    axios.post("http://www.test.com/day05/jiekou.php", data).then(res => {
      console.log(res);
    }).catch(err => {
      console.log(err);
    })

  }
</script>
</html>

方法Ⅱ.后端开放options请求跨域,并用对应的方法获取options提交的复杂数据

<?php

// 制定允许其他域名访问
header("Access-Control-Allow-Origin:*");
// 响应类型
header('Access-Control-Allow-Methods: GET, POST, PUT,DELETE,OPTIONS,PATCH');
// 响应头设置
header("Access-Control-Allow-Headers: Origin, X-Requested-With, Content-Type, Accept, Authorization");

//如果是options请求,就结束执行下面语句
if($_SERVER['REQUEST_METHOD']=='OPTIONS'){
  //exit是用来结束程序执行的,如果参数是字符串,PHP将会直接把字符串输出,
  //如果参数是整型(范围是0-254),那个参数将会被作为结束状态使用。
  exit('options类型的请求,结束');
}

//option请求无法用常规方法($_GET, $_POST, $_REQUEST)获取请求参数

$option_data_str = file_get_contents("php://input");
$option_data = json_decode($option_data_str,true);
$username = isset($option_data['username'])?$option_data['username']:"";
$password = isset($option_data['password'])?$option_data['password']:"";


// 判断form表单中key
if(isset($username) && isset($password)){
  // 判断username和password
  if($username == "admin" && $password == "123456"){
    
    $result = array("success" => 1, "code" => 101, "data" => array("username" => $username, "password" => $password));  
  
  }else{
    $result = array("success" => 0, "code" => 103, "data" => null);
  }
  
}else{
  $result = array("success" => 0, "code" => 100, "data" => null);
}
// 将错误信息(数组)转换成json类型,返回前端
echo(json_encode($result));
?>

小结::

Ⅰ.个人是比较倾向于由后端来解决(前端还要引入qs插件,没什么必要)

Ⅱ.在vue里面使用qs的步骤

➀qs是一个npm仓库所管理的包,可通过npm install qs命令进行安装.

传送门[https://www.npmjs.com/package/qs](https://www.npmjs.com/package/qs)

qs.parse()将URL解析成对象的形式

qs.stringify()将对象 序列化成URL的形式,以&进行拼接(我们大都用到这个)

➁在全局main.js里引入qs并配置方法到原型上

import qs from 'qs';
Vue.prototype.$qs = qs;

在所有的vue实例组件里都可以直接用this.$qs.stringify(要处理的数据),进行数据转换

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

Javascript 相关文章推荐
js模拟弹出效果代码修正版
Aug 07 Javascript
javascript获得CheckBoxList选中的数量
Oct 27 Javascript
JavaScript 学习笔记(四)
Dec 31 Javascript
25个好玩的JavaScript小游戏分享
Apr 22 Javascript
js 自定义个性下拉选择框示例
Aug 20 Javascript
简单js代码实现selece二级联动(推荐)
Feb 18 Javascript
javascript在当前窗口关闭前检测窗口是否关闭
Sep 29 Javascript
做web开发 先学JavaScript
Dec 12 Javascript
jQuery Autocomplete简介_动力节点Java学院整理
Jul 17 jQuery
浅谈node模块与npm包管理工具
Jan 03 Javascript
Vue框架里使用Swiper的方法示例
Sep 20 Javascript
微信小程序中网络请求缓存的解决方法
Dec 29 Javascript
vue动态注册组件实例代码详解
May 30 #Javascript
实用的Vue开发技巧
May 30 #Javascript
vue-router的两种模式的区别
May 30 #Javascript
详解小程序中h5页面onShow实现及跨页面通信方案
May 30 #Javascript
JS通过ajax + 多列布局 + 自动加载实现瀑布流效果
May 30 #Javascript
全面分析JavaScript 继承
May 30 #Javascript
浅谈Express.js解析Post数据类型的正确姿势
May 30 #Javascript
You might like
php使用pdo连接mssql server数据库实例
2014/12/25 PHP
PHP微信开发之文本自动回复
2016/06/23 PHP
PHP HTTP 认证实例详解
2016/11/03 PHP
页面中js执行顺序
2009/11/09 Javascript
js函数模拟显示桌面.scf程序示例
2014/04/20 Javascript
JQuery中使用Ajax赋值给全局变量失败异常的解决方法
2014/08/18 Javascript
JavaScript实现SHA-1加密算法的方法
2015/03/11 Javascript
基于slideout.js实现移动端侧边栏滑动特效
2016/11/28 Javascript
关于Vue.js 2.0的Vuex 2.0 你需要更新的知识库
2016/11/30 Javascript
hovertree插件实现二级树形菜单(简单实用)
2016/12/28 Javascript
jQuery实现字体颜色渐变效果的方法
2017/03/29 jQuery
Angular2 父子组件数据通信实例
2017/06/22 Javascript
vue axios用法教程详解
2017/07/23 Javascript
微信小程序开发之好友列表字母列表跳转对应位置
2017/09/26 Javascript
在小程序中使用Echart图表的示例代码
2018/08/02 Javascript
vue组件之间通信实例总结(点赞功能)
2018/12/05 Javascript
解决echarts数据二次渲染不成功的问题
2020/07/20 Javascript
python中实现定制类的特殊方法总结
2014/09/28 Python
在Python中marshal对象序列化的相关知识
2015/07/01 Python
Django实现快速分页的方法实例
2017/10/22 Python
Django admin美化插件suit使用示例
2017/12/12 Python
Django入门使用示例
2017/12/12 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
Python3利用Dlib19.7实现摄像头人脸识别的方法
2018/05/11 Python
python读取一个目录下所有txt里面的内容方法
2018/06/23 Python
在Python中通过getattr获取对象引用的方法
2019/01/21 Python
Mio Skincare英国官网:身体紧致及孕期身体护理
2018/08/19 全球购物
亚洲在线旅行门户网站:Expedia.com.hk(智游网)
2020/04/14 全球购物
财务助理岗位职责
2013/11/10 职场文书
简历中个人求职的自我评价模板
2013/11/29 职场文书
回门宴父母答谢词
2014/01/26 职场文书
教师远程培训感言
2014/03/06 职场文书
公司自我介绍演讲稿
2014/08/21 职场文书
会议开幕词
2015/01/28 职场文书
土木工程毕业答辩开场白
2015/05/29 职场文书
Python采集壁纸并实现炫轮播
2022/04/30 Python