当前位置: 首页 > news >正文

Ajax加强

XMLHttpRequest的基本使用

XMLHttpRequest(xhr)是浏览器提供的js对象,可以通过它请求服务器上的数据资源

jQuery中的Ajax就是基于xhr对象封装出来的

使用xhr发起GET请求

步骤:

1、创建xhr对象

var xhr = new XMLHttpRequest();

2、调用xhr.open()函数

xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks');

3、调用xhr.send()函数

xhr.send();

4、监听xhr.onreadystatechange事件

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
       // 获取服务器响应的数据
       console.log(xhr.responseText);
    }
}

xhr的readyState属性

是表示当前Ajax请求所处的状态

状态描述
0UNSENTXMLHttpRequest对象已被创建,但尚未被调用 open方法
1OPENEDopen()方法已经被调用
2HEADERS_RECEIVEDsend()方法已经被调用,响应头也已经被接收
3LOADING数据接收中,此时response属性中已经包含部分数据
4DONEAjax请求完成,这意味这数据传输已经彻底完成或失败

使用xhr发起带参数的GET请求

只需在调用xhr.open期间,为URL地址指定参数即可:

xhr.open('GET', 'http://www.liulongbin.top:3006/api/getbooks?id=1')

URL后面拼接的参数,叫做查询字符串(用于向服务器发送信息的字符串---变量)

格式:?参数=值,多个参数的话,使用&符号进行分隔

GET请求携带参数的本质就是将参数以查询字符串的形式,追加到URL地址后面

URL编码与解码

URL地址中只允许出现英文、标点符号、数字,如果出现其他字符就需要对其进行编码(转义)

URL编码的原则:使用允许的去表示不允许的

浏览器提供了URL编码与解码的API,分别是:

encodeURL()编码的函数

decode URL()解码的函数

注:因为浏览器会自动对URL地址进行编码操作,所以大多数情况下不需要关心URL地址的编码和解码操作

关于URL的更多知识:为什么要进行URL编码_李狗要多读书的博客-CSDN博客_url为什么要编码

使用xhr发起POST请求

步骤:

1、创建xhr对象

var xhr = new XMLHttpRequest();

2、调用xhr.open()函数

xhr.open('POST', 'http://www.liulongbin.top:3006/api/addbook');

3、设置Content-Type 属性(固定写法--必须写在open()函数调用后)

xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');

4、调用xhr.send()函数,同时指定要发送的数据

xhr.send('bookname=水浒传&author=施耐庵&publisher=上海图书馆出版社');

5、监听xhr.onreadystatechange事件

xhr.onreadystatechange = function() {
    if (xhr.readyState === 4 && xhr.status === 200) {
        // 获取服务器响应的数据
        console.log(xhr.responseText);
    }
}

数据交换格式

服务器端与客户端之间进行数据传输与交换的格式

前端领域经常提及的是XMLJSON。其中重点学习JSON

XML(EXtensible Markup Language)--可扩展标记语言(和HTML类似也是一种标记语言)

XML和HTML的区别

虽然二者都是标记语言,但是,他们没有任何关系

HTML是被设计来描述网页上的内容,是网页内容的载体

XML是设计用来传输和存储数据,是数据的载体

XML的缺点:

1、格式臃肿,和数据无关的代码多,体积大,传输效率低

2、在JavaScript中解析XML比较麻烦

JSON(JavaScript Object Notation)---JavaScript对象表示法

简单讲:JSON就是JavaScript对象和数组的字符串表示法

注:JSON的本质是字符串

作用:是一种轻量级的文本数据交换格式,用于存储和传输数据,JSON比XML更小、更快、更易解析

现状:2001年开始推广,到现在JSON已经成为主流的数据交换格式

JSON的两种结构

JSON中包含对象和数组,通过这两种结构的相互嵌套,可以表示各种复杂的数据结构

对象结构:在JSON中表示为{}括起来的内容。数据结构为{key:value,key:value,...}

注:key必须用英文的双引号包裹,value的数据类型可以是数字、字符串(也需用双引号包裹)、布尔值、null、数组、对象6中类型

数组结构:在JSON中表示为[]括起来的内容。数据结构为["java","javascript",30,true...]

数组中数据的类型可以是数字、字符串、布尔值、null、数组、对象6种类型。

JSON语法注意事项:

1、属性名必须使用双引号包裹

2、字符串类型的值必须使用双引号包裹

3、JSON中不允许使用单引号表示字符串

4、JSON中不能写注释

5、JSON最外层必须是对象或数组格式

6、不能使用undefined或函数作为JSON的值

JSON和JS对象的关系

JSON是JS对象的字符串表示法,它使用文本表示一个JS对象的信息,本质是一个字符串

//这是一个对象 
var obj={a:'Hello',b:'Word'} ​ 
//这是一个JSON字符串,本质是一个字符串 
var json='{"a":"Hello","b":"World"}'

JSON和JS对象的互转

JSON字符串转换为JS对象,使用JSON.parse()方法:

var obj=JSON.parse('{"a":"Hello","b":"world"}') //结果是{a:'Hello',b:'World'}

JS对象转换为JSON字符串,使用JSON.stringify()方法:

var json=JSON.stringify({a:'Hello',b:'World'}) //结果是'{"a":"Hello","b":"world"}'

序列化和反序列化

把数据对象转换为字符串的过程,叫做序列化

把字符串转换为数据对象的过程,叫做反序列化

封装自己的Ajax函数

定义options参数选项

处理data参数

// 书写处理data的函数
function resolveData(data) {
    var arr = [];
    for (var k in data) {
        var str = k + '=' + data[k];
        arr.push(str);
    }
    return arr.join('&');
}

定义itheima函数

function itheima(options) {
    var xhr = new XMLHttpRequest();
​
    // 把外界传递过来的参数对象,转换为 查询字符串
    var qs = resolveData(options.data);
​
    // 判断请求的类型
    if (options.method.toUpperCase() === 'GET') {
        // 发起GET请求
        xhr.open(options.method, options.url + '?' + qs);
        xhr.send();
    } else if (options.method.toUpperCase() === 'POST') {
        // 发送post请求
        xhr.open(options.method, options.url);
        xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
        xhr.send(qs);
    }
​
    xhr.onreadystatechange = function() {
        if (xhr.readyState === 4 && xhr.status === 200) {
            var result = JSON.parse(xhr.responseText);
            options.success(result);
        }
    }
}

相关文章:

  • 低代码治理及其必要性
  • 翻了ConcurrentHashMap1.7 和1.8的源码,我总结了它们的主要区别。
  • 信息管理毕业设计题目合集【含源码+论文】
  • BOM批量查询
  • 基于FPGA的数字滤波器fir
  • Js手写面试题5-Promise
  • T1094 与7无关的数(信息学一本通C++)
  • MySQL高可用之MHA集群
  • Hive数据类型、部分函数及关键字整理
  • Python采集某Top 250信息,再也不怕寂寞无聊......
  • 【XGBoost】第 2 章:深度决策树
  • 如何在Linux服务器上部署Vue项目
  • 基于 velero 工具迁移 kubesphere 后端存储
  • SAP PI PO 接口常见问题处理:队列平衡的统计平均分配
  • Vue学习之旅——开发准备
  • [译]CSS 居中(Center)方法大合集
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • CSS盒模型深入
  • HTML5新特性总结
  • IE报vuex requires a Promise polyfill in this browser问题解决
  • Python十分钟制作属于你自己的个性logo
  • 安卓应用性能调试和优化经验分享
  • 从0到1:PostCSS 插件开发最佳实践
  • 解析带emoji和链接的聊天系统消息
  • 前端技术周刊 2019-01-14:客户端存储
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 设计模式 开闭原则
  • 微信小程序:实现悬浮返回和分享按钮
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • #define用法
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (poj1.2.1)1970(筛选法模拟)
  • (pytorch进阶之路)CLIP模型 实现图像多模态检索任务
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)计算机毕业设计SSM智能化管理的仓库管理
  • (七)MySQL是如何将LRU链表的使用性能优化到极致的?
  • (区间dp) (经典例题) 石子合并
  • (十五)使用Nexus创建Maven私服
  • (算法)前K大的和
  • (万字长文)Spring的核心知识尽揽其中
  • (五)关系数据库标准语言SQL
  • (转)3D模板阴影原理
  • (转)nsfocus-绿盟科技笔试题目
  • (转)ObjectiveC 深浅拷贝学习
  • .helper勒索病毒的最新威胁:如何恢复您的数据?
  • .Mobi域名介绍
  • .NET Core实战项目之CMS 第一章 入门篇-开篇及总体规划
  • .net framework 4.0中如何 输出 form 的name属性。
  • .net 简单实现MD5
  • .net 无限分类
  • .Net 知识杂记
  • .net网站发布-允许更新此预编译站点
  • .net中调用windows performance记录性能信息
  • /usr/local/nginx/logs/nginx.pid failed (2: No such file or directory)