js【详解】ajax (含XMLHttpRequest、 同源策略、跨域)

ajax 的核心API – XMLHttpRequest

get 请求

// 新建 XMLHttpRequest 对象的实例
const xhr = new XMLHttpRequest();
// 发起 get 请求,open 的三个参数为:请求类型,请求地址,是否异步请求( true 为异步,false 为同步)
xhr.open("GET", "/data/test.json", false);// 定义 xhr 状态改变的处理函数
xhr.onreadystatechange = function () {// xhr 的 readyState 属性变为 4if (xhr.readyState === 4) {// 网络请求返回的状态码为 200if (xhr.status === 200) {alert(xhr.responseText);} else if (xhr.status === 404) {// 网络请求返回的状态码为 404console.log("404 not found");} else {console.log("其他情况");}}
};// 发出请求,会触发 xhr 状态的改变
xhr.send(null);

post 请求

// 新建 XMLHttpRequest 对象的实例
const xhr = new XMLHttpRequest();
// open 的三个参数为:请求类型,请求地址,是否异步请求( true 为异步,false 为同步)
xhr.open("POST", "/login", false);// 定义 xhr 状态改变的处理函数
xhr.onreadystatechange = function () {// xhr 的 readyState 属性变为 4if (xhr.readyState === 4) {// 网络请求返回的状态码为 200if (xhr.status === 200) {alert(xhr.responseText);} else if (xhr.status === 404) {// 网络请求返回的状态码为 404console.log("404 not found");} else {console.log("其他情况");}}
};// 定义 post 请求的参数
const postData = {userName: "朝阳",password: "xxx",
};// 发出请求 -- 参数需转为字符串
xhr.send(JSON.stringify(postData));

XMLHttpRequest 的 readyState 属性

  • 0 —— UNSET 尚未调用 open方法
  • 1 —— OPENED open 方法已被调用
  • 2 —— HEADERS RECEIVED send 方法已被调用,header 已被接收
  • 3 —— LOADING 下载中,responseText已有部分内容
  • 4 —— DONE 下载完成

XMLHttpRequest 的 status 属性

即 http 请求的状态码,详见
https://blog.csdn.net/weixin_41192489/article/details/136446539

同源策略

ajax 请求地址的 协议、域名、端口 必须和当前网页的地址相同!

  • 浏览器中的 ajax 请求才有同源策略限制
  • 图片、css文件、js文件的加载,没有同源策略限制,应用如下:
    • 图片用于使用第三方统计服务完成统计打点(如统计网页浏览量)
    • 使用 CDN 加速图片、css文件、js文件
    • <script> 可用于实现 JSONP

跨域

所有的跨域,都必须经过 server 端允许和配合

方案一 JSONP

JSONP 实现跨域的过程:借助 script 标签没有同源策略限制的特点,向跨域的目标服务器加载到需要的数据。

范例:

 <script>window.callback= function (data) {console.log(data)}</script><script src="http://localhost:8008/jsonp.js"></script>

jsonp.js

callback({ name: '朝阳' }
)

借助 script 标签 向目标服务器加载到 jsonp.js 文件,执行 callback 函数,因本地已定义了 callback 函数,便会触发本地 js 代码的执行,获取到 jsonp.js 文件中的数据,从而实现了跨域。

jQuery 实现 jsonp

在这里插入图片描述
jQuery 内实现 jsonp 的方式与范例中相同,只是进行了封装。

方案二 CORS

服务器设置 http header,即服务器端将指定网址设置为白名单,允许它以指定的方法进行跨域访问。(纯服务端的修改实现,和前端无关)

在这里插入图片描述

【考题】手写一个简易的 ajax

function ajax(url) {const p = new Promise((resolve, reject) => {const xhr = new XMLHttpRequest()xhr.open('GET', url, true)xhr.onreadystatechange = function () {if (xhr.readyState === 4) {if (xhr.status === 200) {resolve(JSON.parse(xhr.responseText))} else if (xhr.status === 404 || xhr.status === 500) {reject(new Error('404 not found'))}}}xhr.send(null)})return p
}

使用

const url = '/data/test.json'
ajax(url)
.then(res => console.log(res))
.catch(err => console.error(err))

【考题】怎么实现跨域?

  • JSONP
  • CORS

实战中实现 ajax 的常用插件

  • jQuery
  • fetch —— 新增的 Web API
  • axios

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/742037.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux使用git命令行教程

. 个人主页&#xff1a;晓风飞 专栏&#xff1a;数据结构|Linux|C语言 路漫漫其修远兮&#xff0c;吾将上下而求索 文章目录 git安装git仓库的创建.git 文件添加文件git 三板斧(add,commit,push)解释拓展git log.gitignore git安装 首先输入git --version看看有没有安装git 如…

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料

Python语言在编程业界的地位——《跟老吕学Python编程》附录资料 ⭐️Python语言在编程业界的地位2024年3月编程语言排行榜&#xff08;TIOBE前十&#xff09; ⭐️Python开发语言开发环境介绍1.**IDLE**2.⭐️PyCharm3.**Anaconda**4.**Jupyter Notebook**5.**Sublime Text** …

操作系统——cpu、内存、缓存介绍

一、内存是什么 内存就是系统资源的代名词&#xff0c;它是其他硬件设备与 CPU 沟通的桥梁&#xff0c; 计算机中的所有程序都在内存中运行。其作用是暂时存放CPU的运算数据&#xff0c;以及与硬盘交换的数据。也是相当于CPU与硬盘沟通的桥梁。只要计算机在运行&#xff0c;CP…

【C++那些事儿】深入理解C++类与对象:从概念到实践(下)| 再谈构造函数(初始化列表)| explicit关键字 | static成员 | 友元

&#x1f4f7; 江池俊&#xff1a;个人主页 &#x1f525; 个人专栏&#xff1a;✅C那些事儿 ✅Linux技术宝典 &#x1f305; 此去关山万里&#xff0c;定不负云起之望 文章目录 1. 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit 关键字 2. static成员2.1 概念…

EasyPoi 教程

文章目录 EasyPoi教程文档1. 前传1.1 前言 这个服务即将关闭,文档迁移到 http://www.wupaas.com/ 请大家访问最新网站1.2 Easypoi介绍1.3 使用1.4 测试项目1.5 可能存在的小坑 2. Excel 注解版2.1 Excel导入导出2.2 注解注解介绍ExcelTargetExcelEntityExcelCollectionExcelIgn…

【PTA】L1-026 L1-027(c++) L1-028 L1-029 L1-030 L1-031(C)第五天

目录 L1-026 I Love GPLT 题解&#xff1a; L1-027 出租 题解&#xff08;c&#xff09;&#xff1a; L1-028 判断素数 题解&#xff1a; L1-029 是不是太胖了 题解&#xff1a; L1-030 一帮一 题解&#xff1a; L1-031 到底是不是太胖了 题解&#xff1a; L1-026 I…

智慧城市与数字经济:共创城市新价值

随着科技的快速发展&#xff0c;智慧城市与数字经济已成为推动城市现代化进程的重要引擎。它们不仅提升了城市治理的效率和公共服务水平&#xff0c;还为城市经济发展注入了新的活力。本文旨在探讨智慧城市与数字经济如何共同创造城市新价值&#xff0c;并分析其面临的挑战与发…

R语言复现:如何利用logistic逐步回归进行影响因素分析?

Logistic回归在医学科研、特别是观察性研究领域&#xff0c;无论是现况调查、病例对照研究、还是队列研究中都是大家经常用到的统计方法&#xff0c;而在影响因素研究筛选自变量时&#xff0c;大家习惯性用的比较多的还是先单后多&#xff0c;P&#xff1c;0.05纳入多因素研究&…

【考研学子必看 ★2024考研国家线及调剂策略(2)】

----------------------------------------------------------------------------------------------------- 考研复试科研背景提升班 教你快速深入了解掌握考研复试面试中的常见问题以及注意事项&#xff0c;系统的教你如何在短期内快速提升自己的专业知识水平和编程以及英语…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:TimePicker)

时间选择组件&#xff0c;根据指定参数创建选择器&#xff0c;支持选择小时及分钟。 说明&#xff1a; 该组件从API Version 8开始支持。后续版本如有新增内容&#xff0c;则采用上角标单独标记该内容的起始版本。 子组件 无 接口 TimePicker(options?: TimePickerOptions)…

银河麒麟V10SP3操作系统-网络时间配置

1、动态网络配置 打开终端&#xff0c;以网口 eth0 为例&#xff1a; nmcli conn add connection.id eth0-dhcp type ether ifname eth0 ipv4.method auto其中“eth0-dhcp”为连接的名字&#xff0c;可以根据自己的需要命名方便记忆和操作 的名字&#xff1b;“ifname eth0”…

CVE-2023-49442 利用分析

1. 漏洞介绍 JEECG(J2EE Code Generation) 是开源的代码生成平台&#xff0c;目前官方已停止维护。JEECG 4.0及之前版本中&#xff0c;由于/api接口鉴权时未过滤路径遍历&#xff0c;攻击者可构造包含 ../ 的url绕过鉴权。攻击者可构造恶意请求利用 jeecgFormDemoController.do…

Redis安装(单机、主从、哨兵、集群)

一、单机安装Redis 首先需要安装Redis所需要的依赖&#xff1a; yum install -y gcc tcl 复制 下载Redis wget https://gitcode.net/weixin_44624117/software/-/raw/master/software/Linux/Redis/redis-6.2.4.tar.gz 复制 创建安装目录 mkdir /usr/local/redis 复制 …

走进AI新时代:织信低代码的实践与启示

最近 AIGC 很火&#xff0c;在各个领域都玩出了一些新花样。 比如在“低代码”领域&#xff0c;可以通过 AI 自动生成一个网站门户。 但这会带来开发效率的提升吗&#xff1f;如果 AI 能快速开发网站、APP等业务应用&#xff0c;那么 AI 生成能否完全取代低代码的可视化配置&a…

产品实操——立项阶段

一、项目开发设计流程&#xff1a; 立项阶段&#xff1a;基本信息、主要方案、市场调研、用户调研、分析得出结论 设计阶段&#xff1a;原型、UI效果图、结构流程设计 开发阶段&#xff1a;前端、后端、数据库、运维等 测试阶段&#xff1a;可用性测试、性能测试、单元测试、集…

跨平台大小端判断与主机节序转网络字节序使用

1.macOS : 默认使用小端 ,高位使用高地址,转换为网络字节序成大端 #include <iostream> #include <arpa/inet.h> int main() {//大小端判断union{short s;char c[sizeof(short)];}un;un.s = 0x0102;printf("低地址:%d,高地址:%d\n",un.c[0],un.c[1]);if …

【安装教程】在Ubuntu上安装MySQL和InfluxDB

一、安装MySQL 官方文档 MySQL :: MySQL Installation Guide :: 7.1 Installing MySQL on Linux Using the MySQL Yum Repositoryhttps://dev.mysql.com/doc/mysql-installation-excerpt/5.7/en/linux-installation-yum-repo.html 1、进入下列网站&#xff0c;选择合适版本的…

第0章 学习包介绍

一、考试介绍 二、考点分析 白盒测试、黑盒测试、面向对象测试、web测试&#xff1b;下午题考的概率很大&#xff1b; 上午题考点&#xff1a; 三、资料包 四、如何学习

每日OJ题_牛客_杨辉三角的变形(IO型OJ)

目录 牛客_杨辉三角的变形 解析代码 牛客_杨辉三角的变形 杨辉三角的变形_牛客题霸_牛客网 解析代码 这题通过的代码首找规律的代码&#xff1a;&#xff08;在下面还贴了普通思路&#xff0c;但超过内存限制的代码&#xff09; 观察分析如果n % 2 1则该行的第一个偶数的位…

移动端研发技术的进化历程

移动端研发技术 移动端研发技术主要分为原生开发和跨平台开发。本章主要介绍一下移动开发技术的过去、当下和未来&#xff0c;一步一步介绍移动技术的进化历程。 原生开发 原生应用程序是指某一个移动平台&#xff08;比如iOS或Android&#xff09;所特有的应用&#xff0c;使…