博客列表 >演示JSON二个函数,练习get,post发起的Ajax请求、跨域的原理与cors,jonp的源码

演示JSON二个函数,练习get,post发起的Ajax请求、跨域的原理与cors,jonp的源码

lus菜
lus菜原创
2021年01月11日 17:00:00677浏览

JSON二个函数:

样式代码:

  1. JSON.stringify(data,replacer,space):将js数据转为json
  2. JSON.parse(str,reviver),将json转为js对象
  3. json其实不是数据类型,只是一个具有特殊格式的字符串而已
  4. 会对json格式字符串的特殊操作,主要通过后面二个参数 第二个参数支持数组 函数。
  1. <script>
  2. //1.将js数据转为json
  3. console.log(JSON.stringify(3.14), typeof JSON.stringify(3.14));
  4. console.log(JSON.stringify("php.cn"), typeof JSON.stringify("php.cn"));
  5. console.log(JSON.stringify(true), typeof JSON.stringify(true));
  6. console.log(JSON.stringify(null), typeof JSON.stringify(null));
  7. //array, object
  8. console.log(
  9. JSON.stringify({ x: "a", y: "b" }), //json对象的属性必须加双引号,字符串也必须加双引号
  10. typeof JSON.stringify({ x: "a", y: "b" })
  11. );
  12. console.log(JSON.stringify([1, 2, 3]), typeof JSON.stringify([1, 2, 3]));
  13. console.log(JSON.stringify({ a: 1, b: 2, c: 3 })); //数组
  14. console.log(JSON.stringify({ a: 1, b: 2, c: 3 }, ["a", "b"]));
  15. console.log( //函数
  16. JSON.stringify({ a: 1, b: 2, c: 3 }, (k, v) => {
  17. if (v < 2) return undefined; //将需要过滤掉的数据直接返回undefined
  18. return v;
  19. })
  20. );
  21. console.log(JSON.stringify({ a: 1, b: 2, c: 3 }, null, 2)); //第三个参数,用来格式化输出的json字符串
  22. console.log(JSON.stringify({ a: 1, b: 2, c: 3 }, null, "****"));
  23. let obj = JSON.parse(`{"a":1,"b":2,"c":3}`);
  24. console.log(obj, typeof obj); //2.将json转为js对象
  25. console.log(obj.a, obj.b, obj.c);
  26. obj = JSON.parse(`{"a":1,"b":2,"c":3}`, (k, v) => { //第二个参数可以对json的数据进行处理后再返回
  27. if (k === "") return v; //json对象是由内向外解析
  28. return v * 2;
  29. });
  30. console.log(obj);
  31. </script>

效果预览:

get请求:

样式代码:

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

php代码:

  1. <?php
  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. $id = $_GET['id']; // 查询条件
  8. $key = array_search($id,array_column($users,'id')); // 在id组成的数组中查询是否存在指定的id,并返回对应的键名
  9. echo json_encode($users[$key]); // 根据键名返回指定的用户信息

效果预览:

post请求:

样式代码:

  1. <title>ajax-post</title>
  2. <style>
  3. .login {
  4. width: 20em;
  5. border: 1px solid;
  6. padding: 0 1em 1em;
  7. background-color: lightblue;
  8. margin: 2em auto;
  9. display: grid;
  10. place-items: center;
  11. }
  12. .login form {
  13. display: grid;
  14. grid-template-columns: 3em 1fr;
  15. gap: 1em 0;
  16. }
  17. .login form button, //按钮与提示信息显示在第二列
  18. .tips {
  19. grid-area: auto / 2;
  20. }
  21. </style>
  22. <body>
  23. <div class="login">
  24. <h3>用户登录</h3>
  25. <form action="" onsubmit="return false">
  26. <label for="email">邮箱:</label>
  27. <input type="email" name="email" id="email" />
  28. <label for="password">密码:</label>
  29. <input type="password" name="password" id="password" />
  30. <button>提交</button>
  31. <span class="tips"></span>
  32. </form>
  33. </div>
  34. <script>
  35. const form = document.querySelector(".login form");
  36. const btn = document.querySelector(".login button");
  37. const tips = document.querySelector(".tips");
  38. console.log(form, btn, tips);
  39. btn.onclick = (ev) => {
  40. ev.preventDefault(); //禁用默认行为
  41. const xhr = new XMLHttpRequest(); // 1. 创建 xhr 对象:
  42. xhr.open("post", "test2.php"); // 2. 配置 xhr 参数:
  43. xhr.onload = () => (tips.innerHTML = xhr.response); // 3. 处理 xhr 响应
  44. xhr.send(new FormData(form)); // 4. 发送 xhr 请求:
  45. };
  46. </script>
  47. </body>

php代码:

  1. <?php
  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. $email = $_POST['email']; // 将通过post获取的数据保存到临时变量中
  8. $password = md5($_POST['password']);
  9. // 使用数组过滤器查询是否存在指定的用户并返回结果
  10. $res = array_filter($users,function($user) use ($email,$password){
  11. return $user['email'] === $email && $user['password'] === $password;
  12. });
  13. echo count($res) === 1 ? '验证成功' : '验证失败'; // 将结果做为请求响应返回到前端

效果预览:

跨域的原理:

  1. cors: 跨域资源共享,同源策略: 为请求的安全,浏览器禁止通过脚本发起一个跨域的请求、只允许通过脚本发起基于同源的请求
  2. 同源指: 协议相同,域名/主机名相同,端口相同
  3. http://www.abc.com http / https://www.abc.com https 协议不同
  4. https://www.a.com / https://www.b.com 主机不同也叫域名不同
  5. https://a.cn.8080 / https://a.cn.9090 端口不同

cors:

get-cors演示代码:

  1. <body>
  2. <button>ajax-get-cors</button>
  3. <p></p>
  4. <script>
  5. const btn = document.querySelector("button");
  6. btn.onclick = (ev) => {
  7. const xhr = new XMLHttpRequest(); //1.创建xhr对象:
  8. xhr.open("get", "http://world.io/cors1.php"); //2.配置xhr参数:
  9. xhr.onload = () => //3.处理xhr响应:
  10. (document.querySelector("p").innerHTML = xhr.response);
  11. xhr.send(null); //4.发送xhr请求:
  12. };
  13. </script>
  14. </body>

引入php代码:

  1. <?php
  2. header('Access-Control-Allow-Origin: *'); //*: 任何来源
  3. echo 'CORS: 跨域请求成功';

效果预览:

post-cors演示代码:

  1. <body>
  2. <button>ajax-post-cors</button>
  3. <p class="tips"></p>
  4. <script>
  5. const btn = document.querySelector("button"); //cors: 跨域资源共享
  6. const tips = document.querySelector(".tips");
  7. btn.onclick = (ev) => {
  8. const xhr = new XMLHttpRequest(); //创建对象
  9. xhr.open("post", "http://world.io/cors2.php");: //配置参数
  10. xhr.onload = () => (tips.innerHTML = xhr.response); //处理响应
  11. let formData = new FormData(); //发送请求
  12. formData.append("email", "admin@php.cn");
  13. formData.append("password", "123456");
  14. xhr.send(formData );
  15. };
  16. </script>
  17. </body>

引入外部php代码:

  1. <?php
  2. header('Access-Control-Allow-Origin: *'); // 在服务器端开启跨域许可, *: 任何来源
  3. print_r($_POST); // 返回前端post提交的数据

效果预览:

jonp

  1. jsonp: JSON with padding (将json填充进来)
  2. jsonp 看上去与 json 很像,是的jsonp: 只是将json数据包含在一个函数调用中jsonp:callback({"id":1,"name":"admin"})
  3. jsonp: 包括二部分: 回调函数 + json数组
  4. 回调函数: 请求接收到响应时回调的函数,可动态设置
  5. 回调参数: 做为参数传递能函数的json数据
  6. jsonp 巧妙的利用了script标签发起的请求不受跨域限制的特征
  7. 将跨域请求的url做为scriptsrc属性值,实现不需要服务器授权的跨域请求,jsonp只能完成 get 请求

样式代码:

  1. <body>
  2. <button>jsonp-cors</button>
  3. <p></p>
  4. <script>
  5. function getUser(data) { //1.jsonp原理
  6. console.log(data);
  7. let user = data.name + ": " + data.email;
  8. document.querySelector("p").innerHTML = user;
  9. }
  10. const btn = document.querySelector("button");
  11. btn.onclick = () => {
  12. let script = //1.动态生成一个允许跨域请求的html元素 document.createElement("script");
  13. script.src = "http://world.io/cors3.php?callback=getUser"; //2.将跨域请求的url添加到src属性上
  14. document.body.insertBefore(script, document.body.firstElementChild); //3.将script挂载到页面中
  15. };
  16. </script>
  17. </body>

外部php代码:

  1. <?php
  2. //jsonp 不需要传授给前,只要返回一个使用json作为参数的函数调用语句就可以,将前端需要的数据以json格式放到这个函数的参数中就行了
  3. $callback = $_GET['callback']; //必须要知道前端js要调用 的函数名称
  4. $data = '{ "name": "天蓬","email": "tp@php.cn" }'; //服务器中需要返回的数据
  5. $data = '{ "name": "灭绝","email": "mj@php.cn" }';
  6. //调用: 在后端生成一条js函数调用语句: getUser({ name: "天蓬","email": "tp@php.cn" });
  7. echo $callback . '(' .$data. ')';

效果预览:

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