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 相关文章推荐
Prototype使用指南之hash.js
Jan 10 Javascript
jQuery实现长文字部分显示代码
May 13 Javascript
解析js原生方法创建表格效率测试
Jul 08 Javascript
window.showModalDialog()返回值的学习心得总结
Jan 07 Javascript
Javascript实现带关闭按钮的网页漂浮广告代码
Jan 12 Javascript
jquery单行文字向上滚动效果的实现代码
Sep 05 Javascript
ie下js不执行的几种可能
Feb 28 Javascript
原生JS实现的多个彩色小球跟随鼠标移动动画效果示例
Feb 01 Javascript
vue组件传递对象中实现单向绑定的示例
Feb 28 Javascript
React组件重构之嵌套+继承及高阶组件详解
Jul 19 Javascript
JavaScript实现美化滑块效果
May 17 Javascript
如何将JavaScript将数组转为树形结构
Jun 02 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常用代码大全(新手入门必备)
2010/06/29 PHP
ThinkPHP与PHPExcel冲突解决方法
2011/08/08 PHP
PHP开发实现微信退款功能示例
2017/11/25 PHP
PHP中isset、empty的用法与区别示例详解
2020/11/05 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
js判读浏览器是否支持html5的canvas的代码
2013/11/18 Javascript
jQuery实现加入购物车飞入动画效果
2015/03/14 Javascript
JavaScript中操作字符串之localeCompare()方法的使用
2015/06/06 Javascript
jquery采用oop模式class类的使用示例
2016/01/22 Javascript
理解Javascript文件动态加载
2016/01/29 Javascript
Winform客户端向web地址传参接收参数的方法
2016/05/17 Javascript
详解JSONObject和JSONArray区别及基本用法
2017/10/25 Javascript
使用imba.io框架得到比 vue 快50倍的性能基准
2019/06/17 Javascript
学习LayUI时自研的表单参数校验框架案例分析
2019/07/29 Javascript
详解为什么Vue中不要用index作为key(diff算法)
2020/04/04 Javascript
Vue实现input宽度随文字长度自适应操作
2020/07/29 Javascript
[02:23]DOTA2英雄基础教程 幻影长矛手
2013/12/09 DOTA
[02:40]2014DOTA2 国际邀请赛中国区预选赛 四大豪门抵达华西村
2014/05/23 DOTA
Python实现windows下模拟按键和鼠标点击的方法
2015/03/13 Python
Python中使用ElementTree解析XML示例
2015/06/02 Python
Python实现优先级队列结构的方法详解
2016/06/02 Python
Python简单实现网页内容抓取功能示例
2018/06/07 Python
替换python字典中的key值方法
2018/07/06 Python
详解基于python的多张不同宽高图片拼接成大图
2019/09/26 Python
Python+Tensorflow+CNN实现车牌识别的示例代码
2019/10/11 Python
Python如何使用PIL Image制作GIF图片
2020/05/16 Python
python中format函数如何使用
2020/06/22 Python
python matlab库简单用法讲解
2020/12/31 Python
Html5游戏开发之乒乓Ping Pong游戏示例(二)
2013/01/21 HTML / CSS
KENZO官网:高田贤三在法国创立的品牌
2019/05/16 全球购物
LN-CC中国:高端男装和女装的奢侈时尚目的地
2019/09/14 全球购物
校长就职演讲稿
2014/01/06 职场文书
2014年教育培训工作总结
2014/12/08 职场文书
统计员岗位职责范本
2015/04/14 职场文书
HR在给员工开具离职证明时,需要注意哪些问题?
2019/07/03 职场文书
redis击穿 雪崩 穿透超详细解决方案梳理
2022/03/17 Redis