博客列表 >JSON与JS的转换、JSONP跨域、xhr/fetch请求与async使用方法

JSON与JS的转换、JSONP跨域、xhr/fetch请求与async使用方法

Jet的博客
Jet的博客原创
2023年03月11日 22:45:35386浏览

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