博客列表 >JSON、AJAX初学习+简上手

JSON、AJAX初学习+简上手

景云
景云原创
2021年03月02日 17:46:32615浏览

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 . ")";
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议