目录
🆙【前文回顾】👉 如何添加自定义函数及封装自定义插件_09
1. $.ajax({
url:"服务器端接口地址",
type:"get或post",
data:{ 参数名: 参数值, ... ... }, // 要发送给服务器的参数
dataType:"json", // 自动调用JSON.parse()
success:function(result){ // 等效于之前的onreadystatechange
// 仅在成功收到响应结果后自动执行!
// 今后,只要希望在ajax获得数据后才自动执行的代码,必须都要放在success中!
// result会自动获得ajax接收到的响应结果,被JSON.parse()转换后的直接可用的数组或对象!
}
})
2. 示例:使用$.ajax()函数一句话向服务器发送请求接收响应
15_$_ajax.html
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- <script src="js/jquery-1.11.3.js">script>
- head>
- <body>
- <script>
- //从新浪云服务器获取首页6个商品
- $.ajax({
- url:"http://xzserver.applinzi.com/index",
- type:"get",
- dataType:"json",
- // 响应结果
- // ↓
- success:function(result){
- console.log(result);
- }
- });
- //从新浪云服务器获取5号商品的详细信息
- $.ajax({
- url:"http://xzserver.applinzi.com/details",
- type:"get",
- data:{lid:5},
- dataType:"json",
- // 响应结果
- // ↓
- success:function(result){
- console.log(result);
- }
- })
- //去新浪云服务器验证当前用户是否能登录成功
- $.ajax({
- url:"http://xzserver.applinzi.com/users/signin",
- type:"post",
- data:{uname:"dingding", upwd:"123456"},
- dataType:"json",
- // 响应结果
- // ↓
- success:function(result){
- console.log(result);
- }
- })
- script>
- body>
- html>
运行结果:
1. 什么是跨域: 一个网站下的网页,使用了另一个网站的资源
2. 包括: 5种:
(1). 域名不同: http://www.a.com -> http://www.b.com
(2). 子级域名不同:
http://oa.tedu.cn -> http://hr.tedu.cn
(3). 端口不同:
http://localhost:5050 -> http://localhost:3000
(4). 协议不同:
http://12306.cn -> https://12306.cn
(5). 即使同一台主机,同一个域名,IP与主机名互访也算跨域:
http://localhost:3000 -> http://127.0.0.1:3000
主机名 IP
3. 可以随意跨域的元素:
4. 问题: 浏览器禁止ajax发送跨域请求!
5. 原理:
(1). 浏览器都有同源策略(CORS——Cross Origin Resources Shareing)
(2). 每个从服务器返回的响应结果,都包含服务器端的实际域名或ip地址
(3). 浏览器在收到服务器端响应结果后,都会先检查数据来源的服务端地址是否和网页来源的服务器端地址一样!
a. 如果数据来源的服务器端地址与网页来源的服务器端地址相同,才允许网页使用该数据
b. 如果数据来源的服务器端地址与网页来源的服务器端地址不相同,则浏览器禁止网页使用其它网站来源的数据。
6. 结果:
Access to XMLHttpRequest at 'http://localhost:3000/' from origin 'http://127.0.0.1:5500' has been blocked by CORS policy:
从http://127.0.0.1:5500到http://localhost:3000的xhr请求,被CORS策略拦截了!
No 'Access-Control-Allow-Origin' header is present on the requested resource.
(因为)在请求回来的资源中没有携带'Access-Control-Allow-Origin'头。
7. 示例: 重现ajax跨域错误
16_server.js
- const http=require("http");
- http.createServer((req,res)=>{
- var weather="北京 大风 14~1";
- res.writeHead(200,{
- "Content-Type":"text/plain;charset=utf-8"
- })
- res.write(weather);
- res.end();
- }).listen(3000);
- //1. 右键点击16_server.js文件,选择在集成终端中打开
- //2. 在弹出窗口中,等待出现输入提示符后,输入node 16_server.js
- //3. 不用等待任何输出,直接打开浏览器,地址栏中输入http://localhost:3000按回车
- //结果: 看到服务器端程序返回的天气预报
- //凡是看到Error: listen EADDRINUSE :::3000,说明重复启动了多个服务器端,解决: 点右上角垃圾桶图标,关闭所有现在打开的终端,重新从第一步操作。
16_index.html
- html>
- <html lang="en">
- <head>
- <meta charset="UTF-8">
- <meta name="viewport" content="width=device-width, initial-scale=1.0">
- <title>Documenttitle>
- head>
- <body>
- <script src="js/jquery-1.11.3.js">script>
- <script>
- $.ajax({
- url:"http://localhost:3000",
- success:function(weather){
- document.write(`今日天气:${weather}`)
- }
- })
- script>
- body>
- html>
运行结果:
7. 解决:
(1). 纯服务器端跨域: CORS方式:
a. 让服务器端篡改返回的响应信息中的"寄件人地址"。改成和当前网页来源地址一致!
b. 如何: 在服务器端接口程序中:
res.writeHead(200,{
... : ...
"Access-Control-Allow-Origin":"客户端网页来源地址"
})
c. 原理:
d. 示例: 修改服务器端,使用CORS方式允许跨域
16_server.js
- const http=require("http");
- http.createServer((req,res)=>{
- var weather="北京 大风 14~1";
- res.writeHead(200,{
- "Content-Type":"text/plain;charset=utf-8",
- "Access-Control-Allow-Origin":"http://127.0.0.1:5500"
- })
- res.write(weather);
- res.end();
- }).listen(3000);
- //1. 右键点击16_server.js文件,选择在集成终端中打开
- //2. 在弹出窗口中,等待出现输入提示符后,输入node 16_server.js
- //3. 不用等待任何输出,直接打开浏览器,地址栏中输入http://localhost:3000按回车
- //结果: 看到服务器端程序返回的天气预报
- //凡是看到Error: listen EADDRINUSE :::3000,说明重复启动了多个服务器端,解决: 点右上角垃圾桶图标,关闭所有现在打开的终端,重新从第一步操作。
e. 问题: 将来很可能多个不同的客户端网站,都要访问同一个服务器端。那么,服务器端不可能把寄件人修改成所有客户端网站的地址。众口难调。
(2). JSONP方式: (JSON with padding) —— ⏪高频笔试题 jsonp 跨域
填充式JSON
a. 如何: 服务器端和客户端同时修改
1). 服务器端: 将要返回的数据,转为json字符串之后,填充进一条可执行的js语句字符串中。返回整条js语句。
2). 客户端网页: 不要使用ajax发送请求。改为用