背景:

对接身份证录入和门锁卡号录入设备中,安装驱动完成后,提供的接口服务是http://localhost:8099/?cmd=readbcardid&charset=gbk,返回的数据格式如下:

要求在vue项目上实现JSONP跨域请求,不想因此加载第三方资源,于是利用原生JS构建简单的AJAX,还有跨域请求JSONP的实现

AJAX的根本是XMLHttprequest,而一个完整的AJAX请求一般包括以下步骤:

实例化XMLHttpRequest对象
连接服务器
发送请求
接收响应数据

下面直接上代码

ajax.js

const Ajax = (object) => {object = object || {};object.data = object.data || {};//判断请求类型为AJAX或者JSONPlet json = object.jsonp ? Jsonp(object) : ajax(object);//设置ajax方法function ajax(object) {// 1.设置请求方式:如果没有制定则默认为GETobject.type = (object.type || 'GET').toUpperCase();// 2.设置data数据的格式化object.data = formateObject(object.data);// 3.实例化XMLHttpRequest对象var xhr = window.XMLHttpRequest ? new XMLHttpRequest() : new ActiveXObject('Microsoft.XMLHTTP');// 4.监听事件,只要readyState改变,就会调用readystatechange事件xhr.onreadystatechange = function(){// readyState属性表示请求/响应过程的当前活动阶段,4为完成,已经接收到全部响应数据if(xhr.readyState == 4) {let status = xhr.status;// status : HTTP响应的状态码,2开头表示成功if(status >=200 && status < 300){let response = '';// 判断接受数据的内容类型let type = xhr.getResponseHeader('Content-type');if(type.indexOf('xml') !== -1 && xhr.responseXML) {response = xhr.responseXML; //Document对象响应} else if(type === 'application/json') {response = JSON.parse(xhr.responseText); //JSON响应} else {response = xhr.responseText; //字符串响应};// 成功回调函数object.success && object.success(response);}else {object.error && object.error(response);}}}// 5.连接和传输数据if(object.type == 'GET') {// 三个参数:请求方式、请求地址(get方式时,传输数据是加在地址后的)、是否异步请求(同步请求的情况极少);xhr.open(object.type, object.url + '?' + object.data, true);xhr.send(null);} else {xhr.open(object.type, object.url, true);//必须,设置提交时的内容类型xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded; charset=UTF-8');// 传输数据xhr.send(object.data);}}//设置Jsonp方法function Jsonp(object) {// 创建script标签并加入到页面中let callbackName = object.jsonp,head = document.getElementsByTagName('head')[0];// 设置传递给后台的回调参数名object.data['callback'] = callbackName;let data = formateObject(object.data),script = document.createElement('script');head.appendChild(script);// 创建JSONP的回调函数//创建jsonp回调函数window[callbackName] = function(json) {head.removeChild(script);clearTimeout(script.timer);window[callbackName] = null;object.success && object.success(json);};// 发送请求script.src = object.url + '?' + data;//为了得知此次请求是否成功,设置超时处理if(object.time) {script.timer = setTimeout(function() {window[callbackName] = null;head.removeChild(script);object.error && object.error({message: '请求超时'});}, object.time);}}//data的格式化方法function formateObject(data){if(data){let arr = [];for(let name in data){//encodeURIComponent() :用于对 URI 中的某一部分进行编码arr.push(encodeURIComponent(name) + '=' + encodeURIComponent(data[name]));}//为了防止缓存,在后面添加一个随机数arr.push('randomV=' + randomNumber());return arr.join('&');}else {console.error('无法格式化请求数据')}}//生成随机数的方法function randomNumber(){return Math.floor(Math.random()*10000+404);}}export default Ajax;

使用

import Ajax from "@/utils/ajax"
// 身份证录入
export async function readIDCard(callback = () => {}) {try {Ajax({url : 'http://localhost:8099/',type : 'GET',jsonp : 'fnCallback',data : {cmd: "readbcardid",charset: "gbk",},time: 5000,success: (data) => {if (!data) {return callback({code: 500,msg: "读卡失败,请重试"});}switch (data.resultFlag) {case 0: // 正常读卡return callback({code: 200,msg: "读卡成功",data: data.resultContent.cardid || ""});case -1: // 无卡return callback({code: 500,msg: "请将身份证置于读卡器上"});case -2: // 读卡失败return callback({code: 500,msg: "读卡失败,请检查卡是否置于读卡器上"});default:return callback({code: 500,msg: "读卡失败,请检查卡是否置于读卡器上"});}},error: function(ex){const {message} = ex;return callback({code: 500,msg: message});}})} catch (ex) {return callback({code: 500,msg: "读卡失败,请重试"});}
}

原生JS实现Ajax和JSONP跨域请求相关推荐

  1. js通过jquery的jsonp跨域请求

    js部分: function getMatch(page){$.ajax({url:"http://gms.sgamer.com/index.php?g=Dota2&m=Api&am ...

  2. ajax之jsonp跨域请求

    前端ajax请求代码 后台php处理代码

  3. JS的jsonp是什么?5分钟学会jsonp跨域请求

    一.jsonp是什么? jsonp是解决跨域请求的一种技术.浏览器为了防止CSRF攻击会采用同源策略(协议/主机/端口均相同)限制,对非同源发起http请求(即跨域请求)会被浏览器阻止. 二.json ...

  4. .net学习之母版页执行顺序、jsonp跨域请求原理、IsPostBack原理、服务器端控件按钮Button点击时的过程、缓存、IHttpModule 过滤器...

    1.WebForm使用母版页后执行的顺序是先执行子页面中的Page_Load,再执行母版页中的Page_Load,请求是先生成母版页的控件树,然后将子页面生成的控件树填充到母版页中,最后输出 2.We ...

  5. JSONP跨域请求数据报错 “Unexpected token :”的解决办法

    原文  http://www.cnphp6.com/archives/65409 Jquery使用ajax方法实现jsonp跨域请求数据的时候报错 "Uncaught SyntaxError ...

  6. 轻松搞定JSONP跨域请求

    轻松搞定JSONP跨域请求 一.同源策略 要理解跨域,先要了解一下"同源策略".所谓同源是指,域名,协议,端口相同.所谓"同源策略",简单的说就是基于安全考虑, ...

  7. 【漏洞利用】JSONP跨域请求漏洞 挖掘、利用详解

    参考文章 轻松搞定JSONP跨域请求 jsonp跨域原理,使用以及同源策略 跨域漏洞丨JSONP和CORS跨域资源共享 Tag: Ref: [[019.同源策略]] 本片文章仅供学习使用,切勿触犯法律 ...

  8. Ajax的Post跨域请求

    Ajax的Post跨域请求 什么是跨域请求 同协议,同ip,同端口视为一个域,两个域之间互相访问就是跨域访问请求. 根据浏览器的同源策略,一个域中的脚本只具有访问本域资源的权限,无法访问其他域的资源. ...

  9. Jsonp 跨域请求实例

    Jsonp 跨域请求实例 关于jsonp的一个实例,其实自己也不是很了解,今天下午稍微研究了一下: 简单来说,jsonp就是为了两个不同网站之间数据传递而产生的,主要用于js脚本,因为浏览器本身是禁止 ...

最新文章

  1. Freebsd 下用 sshguard 防止暴力破解 ssh 密码
  2. oracle查看被锁的表和解锁
  3. CodeSmith输错license后的解决办法
  4. java例程练习(布局管理器[FlowLayout])
  5. [转载]锦上添花Sybase数据库题目大网罗-4
  6. python几何拼贴画_图形几何图形拼贴画
  7. OpenVINO Inference Engine之custom Layer自定义算法(VPU版本)
  8. Linux内核同步机制之信号量与锁
  9. iOS中__block 关键字的底层实现原理
  10. 推荐一款焦点图jQuery插件 SlidesJs
  11. Struts2拦截器详解
  12. 【村长的刷题手册-1】LeetCode刷题笔记,不断总结继续出发
  13. Mac中隐藏/显示文件或文件夹
  14. AUTOCAD——倒角命令、圆角命令
  15. webgis中的比例尺实现
  16. 《塞尔达传说:旷野之息》中设计元素的分析
  17. 进入外包公司之后…………
  18. python之bt种子,dht网络共享热门资源
  19. TCP/IP 协议族 简介(应用层,传输层,网络层,链路层)
  20. 国外博士后申请前有哪些准备工作

热门文章

  1. 利用XShell上传、下载文件(使用sz与rz命令),超实用!
  2. Redis 基本操作一
  3. C#设置配置文件与读取配置文件
  4. org.json使用指南
  5. 生成式对抗网络Generative Adversarial Networks(GANs)
  6. 线程池是如何复用的?
  7. 简历要避开哪些坑,资深面试官告诉你!
  8. python分析nginx日志的ip(中篇一)
  9. C++和C#编写调用COM组件
  10. KindEditor使用过程中,用JQ提交表单时,获取不到编辑器的内容