Blogger Information
Blog 77
fans 0
comment 0
visits 55577
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
JSON与JS的转换、JSONP跨域、xhr/fetch请求与async使用方法
Jet的博客
Original
391 people have browsed it

一、JSON与JS的转换

JSON的特点:

  1. 1. 通用,轻量, 利于交互和传输
  2. 2. 独立于语言,主流语言都提供了与 json 的编程接口
  3. 3. json 本质上就是一个格式化字符串
  4. 4. 类型: `number`,`string`,`boolean`,`null`,`array`,`object`
  5. 5. 注: 没有 `undefined`

1.1、js -> json

  1. let res = {
  2. name: '电脑',
  3. price: 8000,
  4. desc: {
  5. brand: 'Lenovo',
  6. cpu: 'I7-1260P',
  7. },
  8. }
  9. console.log(res)
  10. // JSON.stringify()
  11. // 将要序列化成一个JSON字符串的值
  12. let json = JSON.stringify(res)
  13. console.log(json)
  14. console.log(typeof json)
  15. // 格式化:(res, null, 4:空格符)
  16. json = JSON.stringify(res, null, 4)
  17. console.log(json)
  18. // 过滤
  19. json = JSON.stringify(res, ['name', 'price'], 4)
  20. console.log(json)



1.2、json -> js

  1. json = `
  2. {
  3. "course" : "PHP",
  4. "score" : 90,
  5. "content" : ["HTML","CSS","JavaScript"]
  6. }
  7. `
  8. // JSON.parse():
  9. // JSON格式字符串转换为js对象(属性名没有双引号)
  10. obj = JSON.parse(json)
  11. console.log(obj)
  12. console.log(typeof obj)


  1. // 渲染
  2. let str = `
  3. <ul>
  4. <li>课程:${obj.course}</li>
  5. <li>分数:${obj.score}</li>
  6. <li>科目:${obj.content}</li>
  7. </ul>
  8. `
  9. document.body.innerHTML = str


二、JSONP跨域

  1. CORS
  2. 1. CORS: 跨域资源共享(Cross-origin Resource Sharing)
  3. 2. 突破了浏览器同源访问的安全策略
  4. 方案
  5. 1. JSONP: `JSON with Padding` (用 JSON 填充参数)
  6. 2. 服务器允许: `Access-Control-Allow-Origin`

2.1、cors-1: jsonp

html文件

  1. <button onclick="getData()">跨域请求</button>
  2. <script>
  3. // 函数声明
  4. function hello(user){
  5. console.log(user)
  6. }
  7. // 同源:调用
  8. // http://127.0.0.1:5000
  9. // const user = { name:'吴克', email: 'wk@php.cn'}
  10. // hello(user)
  11. // jsonp跨域的本质,是利用了一些html标签,天生具有跨域的特征
  12. // jsonp 是利用了<script src>进行跨域
  13. function getData(){
  14. // 动态创建
  15. // 创建script标签
  16. const script = document.createElement('script')
  17. // 设置url
  18. script.src = 'http://jsonp.edu/cors1.php?fn=hello'
  19. document.body.append(script)
  20. }
  21. </script>

服务器文件:

  1. <?php
  2. // jsonp 跨域
  3. // 要获取的数据和函数调用语句,全部在要跨域的服务器上创建出来
  4. $data = json_encode(['name'=>'如来','email'=>'rl@qq.com']);
  5. $fn = $_GET['fn'];
  6. echo "$fn($data)";


2.2、cors-2: 服务器允许跨域

html文件

  1. <button onclick="getData()">跨域请求</button>
  2. <script>
  3. function getData() {
  4. fetch(`http://jsonp.edu/cors2.php`)
  5. .then(res => res.json())
  6. .then(json => console.log(json))
  7. }
  8. </script>

服务器文件

  1. <?php
  2. // 允许跨域
  3. header("Access-Control-Allow-Origin: *");
  4. echo json_encode(['name'=>'观音','email'=>'gy@qq.com']);

三、xhr/fetch请求与async使用方法

3.1、xhr请求

  1. <button onclick="getData()">xhr请求</button>
  2. <script>
  3. function getData() {
  4. // 1. 创建xhr对象
  5. const xhr = new XMLHttpRequest()
  6. // 2. 响应类型
  7. xhr.responseType = 'json'
  8. // 3. 配置参数
  9. xhr.open('GET', 'https://jsonplaceholder.typicode.com/todos')
  10. // 4. 成功回调
  11. xhr.onload = function(){
  12. console.log(xhr.response)
  13. }
  14. // 5. 失败回调
  15. xhr.onerror = function(){
  16. console.log('Error')
  17. }
  18. // 6. 发送请求
  19. xhr.send(null)
  20. }
  21. </script>


3.2、fetch请求

  1. <button onclick="getData()">fetch请求</button>
  2. <script>
  3. function getData() {
  4. /**
  5. * 1. fetch(url): promise
  6. * 2. then: (response)=>response.json()
  7. * 3. then: (json)=>console.log(json)
  8. */
  9. fetch('https://jsonplaceholder.typicode.com/todos/10')
  10. .then(function (response) {
  11. return response.json()
  12. })
  13. .then(function (json) {
  14. console.log(json)
  15. })
  16. }
  17. </script>


3.3、async

  1. <button onclick="getData()">async请求</button>
  2. <script>
  3. // 将一个函数声明为 async
  4. async function getData() {
  5. let url = 'https://jsonplaceholder.typicode.com/todos/10'
  6. // 1. 等待请求的结果,再进行后面的操作,返回响应对象
  7. const response = await fetch(url)
  8. // 2. 响应一旦成功,将响应结果进行再处理,通常是转为json
  9. const result = await response.json()
  10. console.log(result)
  11. }
  12. </script>


四、小实战:fetch api

  1. const box = document.querySelector('.box')

4.1、获取HTML

html文件

  1. // 一. 获取HTML
  2. async function getHtml() {
  3. // fetch, await
  4. // 1. 发送fetch请求
  5. let url = `http://jsonp.edu/api/html.php`
  6. const response = await fetch(url)
  7. // 2. 解析响应对象
  8. // text() -> html / plain
  9. let data = await response.text()
  10. console.log(data)
  11. // 3. 渲染
  12. box.innerHTML = data
  13. }

服务器文件

  1. <ul style="display:flex; list-style:none; gap:1em;">
  2. <li><a href="">首页</a></li>
  3. <li><a href="">教学视频</a></li>
  4. <li><a href="">社区问答</a></li>
  5. </ul>


4.2、获取JSON

  1. async function getJson() {
  2. // 1. 发送请求fetch
  3. let url = `http://jsonp.edu/api/json.php`
  4. const response = await fetch(url,{
  5. // 请求类型
  6. method: 'get',
  7. })
  8. // 2. 解析响应对象 response
  9. // json() : json->js对象
  10. let data = await response.json()
  11. console.log(data)
  12. // 3. 渲染
  13. const items = data.map(function(item) {
  14. return `<li>${item.id}: ${item.name} ${item.price} 元</li>`
  15. })
  16. console.log(items.join(''))
  17. data = `<ul>${items.join('')}</ul>`
  18. box.innerHTML = data
  19. }

服务器文件

  1. <?php
  2. $data = [
  3. ['id'=>1,'name'=>'外套', 'price'=>300],
  4. ['id'=>2,'name'=>'鞋子', 'price'=>200],
  5. ['id'=>3,'name'=>'袜子', 'price'=>50],
  6. ];
  7. echo json_encode($data);


4.3、post请求

html文件

  1. // 三. post请求(以添加数据为例)
  2. async function postJson(){
  3. // 1. 发送请求fetch
  4. let url = `http://jsonp.edu/api/insert.php`
  5. const response = await fetch(url,{
  6. // 请求类型
  7. method: 'post',
  8. // 请求头
  9. headers: {
  10. // 内容类型
  11. 'content-type': 'application/json; charset=UTF-8'
  12. },
  13. // 将有需要传到服务器上的数据解析为JSON进行发送
  14. body: JSON.stringify({ id:4, name: '牛奶', price:250 }),
  15. })
  16. // 2. 解析响应对象 response
  17. // json() : json -> js
  18. let data = await response.json()
  19. console.log(data)
  20. // 3. 渲染
  21. const items = data.map(function(item){
  22. return `<li>${item.id}: ${item.name} ${item.price} 元</li>`
  23. })
  24. console.log(items.join(''))
  25. data = `<ul>${items.join('')}</ul>`
  26. box.innerHTML = data
  27. }

服务器文件

  1. <?php
  2. // 获取的是json,并不是通过传统的表单键值对过来的
  3. // $_POST 不能用
  4. $jsonStr = file_get_contents('php://input');
  5. // json字符串独立于任何编程语言,要想在当前的语言中使用
  6. // 必须转为当前语言支持的数据类型
  7. // json->php
  8. $item = json_decode($jsonStr,true);
  9. $data = [
  10. ['id'=>1,'name'=>'外套', 'price'=>300],
  11. ['id'=>2,'name'=>'鞋子', 'price'=>200],
  12. ['id'=>3,'name'=>'袜子', 'price'=>50],
  13. ];
  14. // 将前端上传的数据,添加到数组中
  15. array_push($data,$item);
  16. echo json_encode($data);


五、购物车问题:

  1. // 只统计选中商品的总数量和总金额
  2. // 获取数量
  3. nums.forEach(function(num){
  4. console.log(num.value)
  5. })
  6. // 获取金额
  7. prices.forEach(function(price){
  8. console.log(price.textContent)
  9. })

  1. 目前只能从上面代码获取到每项的数量和金额
  2. 我个人思路是从动态点击按钮获取checked状态的数量金额,
  3. 然后相加,得出结果再更新到总数和总金额上面,
  4. 请老师指导一下哈。
Correcting teacher:PHPzPHPz

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