Blogger Information
Blog 40
fans 0
comment 1
visits 34608
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JSON、AJAX初学习+简上手
景云
Original
611 people have browsed it

JSON、AJAX初学习+简上手

1. JSON基础知识

1.1 JSON 是什么?

  • JSON:JavaScript Object Notation(JS 对象表示法)
  • JSON 独立于任何变成语言,几乎所有变成语言都提提供了访问 JSON 数据的 API 接口
  • JSON 是一种语法,用来序列化其他语言创建的数据类型
  • JSON 仅支持 6 种数据类型:对象、数组、数值、字符串、布尔值、null
  • JSON 只是借用了 JS 中的一些数据表示语法,与 JS 并无关系

1.2 JSON 数据类型

序号 类型 描述
1 简单值 数值、字符串、布尔、null
2 复合值 对象、数组

注意:不支持undefined(因为除了 JS 外,其他语言中没有这个undefined定义)

1.3 JS 解析 JSON 的 API

序号 方法 描述
1 JSON.stringify() 将 JS 对象,序列化为 JSON 字符串
2 JSON.parse() 将 JSON 字符串,解析为 JS 对象

—————————————————————————————————-

2. JSON示例

2.1 JSON.stringify(data,replacer,apace):将JS数据转为JSON。

data:JS数据(数组、对象都行);replacer:处理的方式(数组、函数都行);space:限定输出的格式;转为的json数据都是string类型

  1. console.log(JSON.stringify(3.14),typeof JSON.stringify(3.14));//3.14 string
  2. console.log(JSON.stringify("php.cn"),typeof JSON.stringify("php.cn"));//"php.cn" string
  3. console.log(JSON.stringify(true),typeof JSON.stringify(true));//"php.cn" string
  4. console.log(JSON.stringify(null),typeof JSON.stringify(null));//"php.cn" string
  5. console.log(JSON.stringify({x:"a",y:"b"}),typeof JSON.stringify({x:"a",y:"b"}));//{"x":"a","y":"b"} string
  6. console.log(JSON.stringify([1,2,3]),typeof JSON.stringify([1,2,3]));//[1,2,3] string
  7. //>注意:json对象的属性必须加双引号,字符串也是
  8. // 对JSON格式字符串的特殊操作,主要通过第二个参数;第二个参数支持数组和函数
  9. // 数组
  10. console.log(JSON.stringify({a:1,b:2,c:3},["a","b"]));//{"a":1,"b":2} 过滤数据,只要属性是a和b的
  11. // 函数
  12. console.log(JSON.stringify({a:1,b:2,c:3},(k,v)=>{
  13. //将需要过滤的数据直接返回undefined
  14. if(v<2) return undefined;
  15. return v;
  16. }));//{"b":2,"c":3} 过滤数据,只要值小于2的
  17. // 第三个参数用来格式化输出JSON字符串
  18. console.log(JSON.stringify({a:1,b:2,c:3},null,2));//在每组数据前加两个空格
  19. console.log(JSON.stringify({a:1,b:2,c:3},null,"---"));//使用字符串的话则用对应字符串进行标识

2.2 JSON.parse(str,reviver) 将json转为js对象;str为JSON数据;

  1. let obj=JSON.parse(`{"a":1,"b":2,"c":3}`);
  2. console.log(obj,typeof obj);//Object { a: 1, b: 2, c: 3 } object
  3. // reviver可以对json数据进行处理后再返回
  4. obj=JSON.parse(`{"a":1,"b":2,"c":3}`,(k,v)=>{
  5. // json对象是由内向外解析的
  6. if(k==="") return v;
  7. return v*2;
  8. });//{ a: 2, b: 4, c: 6 }

———————————————————————

3. Ajax 异步请求 基础知识

注意:异步请求不要使用 vs code 的 live server 插件,必须创建一个本地服务器环境

3.1 同步与异步

以前端请求后,后端响应为例

  • 同步:前端发请求,必须等到后端响应完成后,才允许发送另外一个请求
  • 异步:前端发请求后不等待后端响应结果继续执行,后端响应完成通过事件通知前端处理

3.2 XMLHttpRequest对象

XMLHttpRequest是浏览器对象,而非 JS 内置对象

3.2.1 xhr 请求步骤

  • 1.创建 xhr 对象:const xhr=new XMLHttpRequest();
  • 2.配置 xhr 参数:xhr.open(type,url);
  • 3.处理 xhr 响应:xhr.onload=(...)=>{...};
  • 4.发送 xhr 请求:xhr.send(...);

3.2.2 xhr 对象常用属性

序号 方法 描述
1 responseType 设置响应类型
2 response 响应正文

3.2.3 xhr 对象常用方法

序号 方法 描述
1 open(type,url) 配置请求参数
2 send(data/null) 发送请求

3.2.4 xhr 对象常用事件

序号 事件 描述
1 load() 请求成功
2 error() 请求失败

https://developer.mozilla.org/zh-CN/docs/Web/API/xmlhttprequest

3.3 FormData对象

FormData是表单数据构造器
|序号|方法|描述|
|—-|——|——|
|1|append(name,value)|请求成功|
|2|delete(name)|请求失败|

https://developer.mozilla.org/zh-CN/docs/Web/API/FormData

3.4 get/post区别

  • get 是 url 传参,post 是request body请求体传参
  • get 回退无影响,post 回退会重复提交
  • get 生成的 url 可以做书签,post 不行
  • get 只能对 url 进行编码,post 支持多种编码
  • get 请求参数会保留在历史记录中,post 请求参数不保留
  • get 参数长度受限,post 参数长度无限制
  • get 只接受 ASCII 码字符,post 无限制
  • get、post 底层实现是一致的,都是基于 http 协议
  • get 也可以带上request body,post 也可以带上 URL 参数
  • get 产生一个 tcp 数据包,post 产生两个 tcp 数据包
  • get 产生一个请求,post 产生两个请求
  • get 请求,浏览器将header,data一起发出,服务器响应 200 成功
  • post 请求,浏览器先发出header,得到响应 100 continue,在发出data,得到响应 200
  • 并非所有浏览器的 post 都产生二次 http 请求,firefox 就只产生一次

3.5跨域

  • CORS:跨域资源共享
  • 跨域请求可以是 get,也可以是 post,不过 get 居多
  • cors-post时,需要在服务器端进行头部设置
  • jsonp 只能是 get

———————————————————————————-

4. AJAX 简单示例

4.1 get方式请求

HTML代码

  1. <button>ajax-get</button>
  2. <p></p>

JavaScript代码

  1. const btn=document.querySelector("button");
  2. btn.onclick=()=>{
  3. // 1.创建 xhr 对象:
  4. const xhr=new XMLHttpRequest();
  5. // 2.配置 xhr 参数:
  6. xhr.open('get',"test.php?id=1");
  7. xhr.responseType='json';//默认,可不写
  8. // 3.处理 xhr 响应:
  9. // 成功
  10. xhr.onload=()=>{
  11. console.log(xhr.response);
  12. //dom将响应结果渲染到页面
  13. let user=`${xhr.response.name}的邮箱:${xhr.response.email}`;
  14. document.querySelector("p").innerHTML=user;
  15. };
  16. // 失败
  17. xhr.error=()=>console.log("Error");
  18. // 4.发送 xhr 请求:
  19. xhr.send(null);
  20. }

PHP代码:test.php

  1. // 以二维数组模拟数据表信息
  2. $users = [
  3. ['id'=>1, 'name'=>'天蓬','email'=>'tp@php.cn','password' => md5('123456')],
  4. ['id'=>2, 'name'=>'灭绝','email'=>'mj@php.cn','password' => md5('abc123')],
  5. ['id'=>3, 'name'=>'西门','email'=>'xm@php.cn','password' => md5('abc888')],
  6. ];
  7. // 查询条件
  8. $id = $_GET['id'];
  9. // 在id组成的数组中查询是否存在指定的id,并返回对应的键名
  10. $key = array_search($id,array_column($users,'id'));
  11. // 根据键名返回指定的用户信息
  12. echo json_encode($users[$key]);

4.2 post方式请求

CSS代码

  1. .login {
  2. width: 20em;
  3. border: 1px solid;
  4. padding: 0 1em 1em;
  5. background-color: lightcyan;
  6. margin: 2em auto;
  7. display: grid;
  8. place-items: center;
  9. }
  10. .login form {
  11. display: grid;
  12. grid-template-columns: 3em 1fr;
  13. gap: 1em 0;
  14. }
  15. /* 按钮与提示信息显示在第二列 */
  16. .login form button,
  17. .tips {
  18. grid-area: auto / 2;
  19. }

HTML代码

  1. <div class="login">
  2. <h3>用户登录</h3>
  3. <form action="">
  4. <label for="email">邮箱:</label>
  5. <input type="email" name="email" id="email" />
  6. <label for="password">密码:</label>
  7. <input type="password" name="password" id="password" />
  8. <button>提交</button>
  9. <span class="tips"></span>
  10. </form>
  11. </div>

JavaScript代码

  1. const form=document.querySelector(".login form");
  2. const btn=document.querySelector(".login button");
  3. const tips =document.querySelector(".tips");
  4. btn.onclick=(ev)=>{
  5. // 要先禁用掉默认提交
  6. ev.preventDefault();//或者在form里添加` onsubmit="return false"`
  7. // 1.创建xhr对象
  8. const xhr=new XMLHttpRequest();
  9. // 2.设置xhr参数
  10. xhr.open("post","test2.php");
  11. // 3.处理xhr响应
  12. xhr.onload=()=>(tips.innerHTML=xhr.response);
  13. // 4.发送xhr请求
  14. xhr.send(new FormData(form));
  15. }

PHP代码:test2.php

  1. // 使用二维数组模拟用户数据表信息
  2. $users = [
  3. ['id' => 1, 'name' => '天蓬', 'email' => 'tp@php.cn', 'password' => md5('123456')],
  4. ['id' => 2, 'name' => '灭绝', 'email' => 'mj@php.cn', 'password' => md5('abc123')],
  5. ['id' => 3, 'name' => '西门', 'email' => 'xm@php.cn', 'password' => md5('abc888')],
  6. ];
  7. // 将通过post获取的数据保存到临时变量中
  8. $email = $_POST['email'];
  9. $password = md5($_POST['password']);
  10. // 使用数组过滤器查询是否存在指定的用户并返回结果
  11. $res = array_filter($users, function ($user) use ($email, $password) {
  12. return $user['email'] === $email && $user['password'] === $password;
  13. });
  14. // 将结果做为请求响应返回到前端
  15. echo count($res) === 1 ? '验证成功' : '验证失败';

4.3 cors:跨域资源共享(get方式)

同源策略:为请求的安全,浏览器禁止通过脚本发起跨域请求;只允许通过脚本发起基于同源(协议相同、域名/主机名相同、端口相同)的请求

HTML

  1. <button>ajax-get-cors</button>
  2. <p></p>

JS

  1. const btn=document.querySelector("button");
  2. const p=document.querySelector("p");
  3. btn.onclick=()=>{
  4. // 1.创建xhr对象
  5. const xhr=new XMLHttpRequest();
  6. // 2.配置xhr参数
  7. xhr.open("get","http://word.cn/index.php");
  8. // 3.处理xhr响应
  9. xhr.onload=()=>(document.querySelector("p").innerHTML=xhr.response);
  10. // 4.发送xhr请求
  11. xhr.send(null);
  12. }

PHP

  1. //在服务器端开启跨域许可;*表示许可任何来源
  2. header("Access-Control-Allow-Origin:http://php.cn");
  3. echo "CORS:跨域请求成功!";

4.4 cors:跨域资源共享(post方式)

HTML

  1. <button>ajax-post-cors</button>
  2. <p></p>

JS

  1. const btn=document.querySelector("button");
  2. const p=document.querySelector("p");
  3. btn.onclick=()=>{
  4. // 1.创建xhr对象
  5. const xhr=new XMLHttpRequest();
  6. // 2.配置xhr参数
  7. xhr.open("post","http://word.cn/index2.php");
  8. // 3.处理xhr响应
  9. xhr.onload=()=>(document.querySelector("p").innerHTML=xhr.response);
  10. // 4.发送xhr请求
  11. const formData=new FormData();
  12. formData.append("username","Jy");
  13. formData.append("password","abc123");
  14. xhr.send(formData);
  15. }

PHP

  1. //在服务器端开启跨域许可;*表示许可任何来源
  2. header("Access-Control-Allow-Origin:http://php.cn");
  3. print_r($_POST);

4.5 jsonp

HTML

  1. <button>jsonp-cors</button>
  2. <p></p>

JS

  1. function getUser(data){
  2. console.log(data);
  3. let user=data.name+":"+data.email;
  4. document.querySelector("p").innerHTML=user;
  5. }
  6. //从前端将这个前端需要调用的函数名称告诉服务器上的php,让php动态生成一个函数调用语句并返回
  7. const btn=document.querySelector("button");
  8. btn.onclick=()=>{
  9. // 1.动态生成一个允许跨域请求的html元素
  10. let script = document.createElement("script");
  11. // 2.将跨域请求的url调价到这个script的src属性上
  12. script.src="http://word.cn/jsonp.php?callback=getUser";
  13. // 3.将script挂在到这个页面中 document.body.insertBefore(script,document.body.firstElementChild);//挂在到body第一个元素之前
  14. }

PHP

  1. // jsonp不需要授权给前端
  2. // 只要返回一个使用json作为参数的函数调用语句就可以
  3. // 将前端需要的数据以json格式放到这个函数中
  4. // 必须要知道前端js要调用的函数名称
  5. $callback = $_GET['callback'];
  6. //从服务器返回需要的数据
  7. $data = '{"name":"景云","email":"jy@php.cn"}';
  8. // 格式为 getUser({"name":"景云","email":"jy@php.cn"});
  9. // 进行拼接e
  10. echo $callback . "(" . $data . ")";
Correcting teacher:天蓬老师天蓬老师

Correction status:qualified

Teacher's comments:
Statement of this Website
The copyright of this blog article belongs to the blogger. Please specify the address when reprinting! If there is any infringement or violation of the law, please contact admin@php.cn Report processing!
All comments Speak rationally on civilized internet, please comply with News Comment Service Agreement
0 comments
Author's latest blog post