博客列表 >front 18 Ajax异步编程(json在js和php之间的get和post)(0812wed)

front 18 Ajax异步编程(json在js和php之间的get和post)(0812wed)

老黑
老黑原创
2020年08月19日 20:10:37661浏览

主要内容:

  1. json文件的反译,转为js对象(是延续上节的内容)-demo1、demo2
  2. Ajax获取数据之GET方法
  3. Ajex获取方法之POST方法(三种),其中的FormData最简洁
  4. 实战:一个登陆验证
  5. json在js和php中的操作(stringify vs parse, encode vs decode)
类型 包装发出 接收解析
js JSON.stringify() JSON.parse()
将json对象转换成json字符串 将json字符串对象化
php json_encode() json_decode()
对象json化 json对象普通化
  • 于是在php和js之间传递数据的时候,会出现stringify(js中)对decode(php中);也会出现encode(php中)对parse(js)中。

1. Ajax的基本知识

  • 解决异步问题

1-1. 同步与异步

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

1-2. XMLHttpRequest 对象

  • XMLHttpRequest 是浏览器提供的 API, 处理异步请求,并非 JS 内置对象
  • 基本流程:
  1. 创建请求对象: new XMLHttpRequest()
  2. 监听请求回调: onreadystatechange
  3. 初始化请求参数: open(请求类型,请求地址,是否异步)
  4. 发送请求: send()
  • 如果是POST请求,以上步骤略有不同
  1. 创建请求对象: new XMLHttpRequest()
  2. 监听请求回调: onreadystatechange()
  3. 初始化请求参数: open(请求类型,请求地址,是否异步)
  4. 设置请求头: setRequestHeader()
  5. 准备请求参数: 可选var data = ...
  6. 发送请求: send(data)

2. json字符串转js对象

  • demo1.html:parse先反译,然后再渲染过去
  • 这个是简单的方法,直接传进前端。
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>json字符串转js对象</title>
  7. </head>
  8. <body>
  9. <ul>
  10. <li></li>
  11. <li></li>
  12. <li></li>
  13. </ul>
  14. <script>
  15. var str =
  16. '{\
  17. "name": "朱老师",\
  18. "sex": "男",\
  19. "age": 88\
  20. }';
  21. // 将json字符串的数据渲染到页面中
  22. // 先将json字符串转为js对象
  23. var obj = JSON.parse(str);
  24. console.log(obj);
  25. console.log(obj.name);
  26. var li1 = document.querySelector("li:first-of-type");
  27. li1.innerHTML = obj.name;
  28. var li2 = document.querySelector("li:nth-of-type(2)");
  29. li2.innerHTML = obj.sex;
  30. var li3 = document.querySelector("li:last-of-type");
  31. li3.innerHTML = obj.age;
  32. </script>
  33. </body>
  34. </html>

  • demo2.html:有条件地反译,并通过js向body中加入内容
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>json转js对象2</title>
  7. </head>
  8. <body>
  9. <script>
  10. var jsonStr =
  11. '{"name":"Peter Zhu",\
  12. "age":29,\
  13. "isMarried":true,\
  14. "course":{"name":"JavaScript","grade":99}}';
  15. // 这个地方的\是转意符,否则分行会显示错误,只能在一行。
  16. var obj = JSON.parse(jsonStr, function (key, value) {
  17. if (key === "isMarried") {
  18. return "本人已婚,有事烧纸";
  19. }
  20. //必须加下以下语句,否则无输出
  21. return value;
  22. });
  23. // 控制台打印结果
  24. // console.log(obj);
  25. // 下面为经过转化和拼接,最终在显示器中显示出来。
  26. var person = {
  27. name: obj.name,
  28. age: obj.age,
  29. courseName: obj.course.name,
  30. courseGrade: obj.course.grade,
  31. };
  32. // console.log(person);
  33. var ul = document.createElement("ul");
  34. var res = "";
  35. for (var key in person) {
  36. // console.log(person[key]);
  37. res += "<li>" + person[key] + "</li>";
  38. }
  39. console.log(res);
  40. ul.innerHTML = res;
  41. document.body.appendChild(ul);
  42. </script>
  43. </body>
  44. </html>

3. Ajax获取数据-GET

  • 一个html文件,中间放js
  • 一个php文件,被js来调用
  • php中通过echo json_encode()来传数据,js中通过JSON.parse(xhr.responseText)来接收。

(demo3.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-GET</title>
  7. </head>
  8. <body>
  9. <button>获取数据</button>
  10. <p></p>
  11. <p></p>
  12. <script>
  13. var btn = document.querySelector("button");
  14. btn.addEventListener("click", getData, false);
  15. function getData() {
  16. // 1. 创建ajax对象
  17. var xhr = new XMLHttpRequest();
  18. // 2. 监听请求
  19. xhr.onreadystatechange = function () {
  20. if (xhr.readyState === 4 && xhr.status === 200) {
  21. // readyState只有四种状态,4的时候代表成功。
  22. // status以2开头的代表成功,3开头代表重名项,4开头的代表错误,例如403;5开头的代表服务器故障。
  23. // 请求成功的返回的文本数据保存在responseText属性中
  24. console.log(xhr.responseText);
  25. // 将数据渲染到页面中
  26. // 凡涉及页面的DOM操作全部放到监听请求的回调中处理
  27. var obj = JSON.parse(xhr.responseText);
  28. // console.log(obj);
  29. // document.querySelector("p:first-of-type").innerHTML = obj.name;
  30. // document.querySelector("p:last-of-type").innerHTML = obj.email;
  31. }
  32. };
  33. // 3. 初始化请求参数
  34. // xhr.open(请求类型, 请求的地址URL, 是否异步)
  35. // xhr.open("get", "test1.php", true);
  36. xhr.open("GET", "test1.php?id=2");
  37. // 4. 发送请求
  38. xhr.send(null);
  39. }
  40. </script>
  41. </body>
  42. </html>

(对应的test1.php)

  1. <?php
  2. // $user = [
  3. // 'name' => 'peter zhu',
  4. // 'email'=> 'peter@php.cn'
  5. // ];
  6. $users = [
  7. [
  8. 'id'=>1,
  9. 'name' => 'peter zhu',
  10. 'email'=> 'peter@php.cn'
  11. ],
  12. [
  13. 'id'=>2,
  14. 'name' => 'Jake ma',
  15. 'email'=> 'jake@php.cn'
  16. ]
  17. ];
  18. $id = $_GET['id'];
  19. echo $id;
  20. // 将数组转为json格式的字符串,返回前端
  21. // return $user;
  22. // return json_encode($user);
  23. // 必须要用echo 才可写入输出流
  24. // echo json_encode($users);

4. Ajax获取数据-POST1

  • 用post方式将数据从前端传递到服务器上
  • 模拟表单键值对方式,将json转为字符串然后传过去
  • js中通过JSON.stringify()来字符串化,php中通过json_decode()来转化(当然前面需要先将json通过key取出来)

(demo4.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-POST</title>
  7. </head>
  8. <body>
  9. <button>获取数据</button>
  10. <script>
  11. var btn = document.querySelector("button");
  12. btn.addEventListener("click", getData, false);
  13. function getData() {
  14. // 1. 创建ajax对象
  15. var xhr = new XMLHttpRequest();
  16. // 2. 监听请求
  17. xhr.onreadystatechange = function () {
  18. if (xhr.readyState === 4 && xhr.status === 200) {
  19. // 请求成功的返回的文本数据保存在responseText属性中
  20. console.log(xhr.responseText);
  21. // 将数据渲染到页面中
  22. // 凡涉及页面的DOM操作全部放到监听请求的回调中处理
  23. // var obj = JSON.parse(xhr.responseText);
  24. // console.log(obj);
  25. }
  26. };
  27. // 3. 初始化请求参数
  28. xhr.open("POST", "test2.php");
  29. // 4. 设置请求头: `setRequestHeader()`
  30. // 模拟表单键值对方式进行发送
  31. xhr.setRequestHeader(
  32. "content-type",
  33. "application/x-www-form-urlencoded"
  34. );
  35. // 准备一下数据(模拟表单键值对)
  36. var user = {
  37. email: "admin@php.cn",//这块也可以来自表单,例如form.email
  38. password: "123456",
  39. };
  40. // 再把js对象转为json字符串
  41. var data = JSON.stringify(user);
  42. // 5. 发送请求, 发送到服务器上的是json格式字符串
  43. // xhr.send(data);
  44. xhr.send(data);
  45. }
  46. </script>
  47. </body>
  48. </html>

(test2.php)

  1. <?php
  2. // print_r($_POST);
  3. // 直接用$_POST,前端的json字符串成了唯一元素的键名了
  4. // Array
  5. // (
  6. // [{"email":"admin@php_cn","password":"123456"}] =>
  7. // )
  8. // 对json传过来的array进行转化,等于将json字符串取出然后生成data。
  9. // 因为之前就是在一个数组中以key的方式存在,因此通过key方式取出。
  10. $data = key($_POST);
  11. // echo $data;
  12. // 下一步, 就是将前端提交过来的json解析成当前编程语言能识别的数据类型
  13. // 比如,对象, 数组
  14. // json_decode()默认将json解析为对象
  15. $user = json_decode($data);
  16. // echo gettype($user);
  17. echo $user->email, ': ', sha1($user->password);
  18. // 也可以将json解析成php数组,当然你这种方式提取元素的方式也就发生改变。
  19. // $user = json_decode($data,true);
  20. // echo $user['email'], ': ', sha1($user['password']);

5. Ajax获取数据-POST2

  • js中通过JSON.stringify()直接传json,服务器端再通过file_get_contents得到,再通过json_decode()来转化

(demo5.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-POST-2</title>
  7. <!--这种适合写接口-->
  8. </head>
  9. <body>
  10. <button>获取数据</button>
  11. <script>
  12. var btn = document.querySelector("button");
  13. btn.addEventListener("click", getData, false);
  14. function getData() {
  15. // 1. 创建ajax对象
  16. var xhr = new XMLHttpRequest();
  17. // 2. 监听请求
  18. xhr.onreadystatechange = function () {
  19. if (xhr.readyState === 4 && xhr.status === 200) {
  20. // 请求成功的返回的文本数据保存在responseText属性中
  21. console.log(xhr.responseText);
  22. }
  23. };
  24. // 3. 初始化请求参数
  25. xhr.open("POST", "test3.php");
  26. // 4. 设置请求头: `setRequestHeader()`
  27. // 直接将内容类型设置为json - 这个地方是区别于demo4的地方。
  28. xhr.setRequestHeader("content-type", "application/json;charset=utf-8");
  29. // json默认也是utf-8,因此charset等内容可以省略掉。
  30. // 后端的php使用标准输入流来获取 php://input
  31. // 准备一下数据(模拟表单键值对)
  32. var user = {
  33. email: "admin@php.cn",
  34. password: "123456",
  35. };
  36. // 再把js对象转为json字符串
  37. var data = JSON.stringify(user);
  38. // 5. 发送请求, 发送到服务器上的是json格式字符串
  39. xhr.send(data);
  40. }
  41. </script>
  42. </body>
  43. </html>

(test3.php)

  1. <?php
  2. // print_r($_POST);
  3. // 从当前的输入流中获取数据。因为$_POST只能从表单中获取数据,或者以表单的形式获取数据。
  4. $data = file_get_contents('php://input');
  5. // echo $data;
  6. // php对象
  7. $user = json_decode($data);
  8. print_r($user);

6. Ajax获取数据-POST3

  • 用Formdata来post数据到服务器端

(demo6.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>Ajax-POST-3-FormData</title>
  7. </head>
  8. <body>
  9. <button>获取数据</button>
  10. <script>
  11. var btn = document.querySelector("button");
  12. btn.addEventListener("click", getData, false);
  13. function getData() {
  14. // 1. 创建ajax对象
  15. var xhr = new XMLHttpRequest();
  16. // 2. 监听请求
  17. xhr.onreadystatechange = function () {
  18. if (xhr.readyState === 4 && xhr.status === 200) {
  19. console.log(xhr.responseText);
  20. }
  21. };
  22. // 3. 初始化请求参数
  23. xhr.open("POST", "test4.php");
  24. // 4. 使用FormData来组织数据,最终仍是以表单数据方式发送
  25. var data = new FormData();
  26. data.append("username", "admin");
  27. data.append("passowrd", "admin888");
  28. // 5. 发送请求, 发送到服务器上的是json格式字符串
  29. xhr.send(data);
  30. }
  31. </script>
  32. </body>
  33. </html>

(test4.php)

  1. <?php
  2. // print_r($_POST);
  3. // 从当前的输入流中获取数据。因为$_POST只能从表单中获取数据,或者以表单的形式获取数据。
  4. $data = file_get_contents('php://input');
  5. // echo $data;
  6. // php对象
  7. $user = json_decode($data);
  8. print_r($user);

7. 实战-一个表单的验证

-

(demo7.html)

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>ajax-json-formdata</title>
  7. </head>
  8. <body>
  9. <p>请登录:</p>
  10. <form
  11. action=""
  12. method="POST"
  13. style="display: grid; gap: 15px;"
  14. onsubmit="return false"
  15. >
  16. <input
  17. type="email"
  18. name="email"
  19. placeholder="exam@email.com"
  20. required
  21. autofocus
  22. />
  23. <input type="password" name="password" placeholder="******" required />
  24. <button>提交</button>
  25. </form>
  26. <script>
  27. // 1. 获取表单和按钮
  28. var form = document.querySelector("form");
  29. var btn = document.querySelector("form button");
  30. // 2. 给按钮绑定事件
  31. btn.onclick = function () {
  32. // 1. 创建ajax对象
  33. var xhr = new XMLHttpRequest();
  34. // 2. 监听请求
  35. xhr.onreadystatechange = function () {
  36. if (xhr.readyState === 4 && xhr.status === 200) {
  37. // console.log(xhr.responseText);
  38. var res = JSON.parse(xhr.responseText);
  39. console.log(res);
  40. // 根据后端返回的状态进行判断
  41. switch (res.status) {
  42. case 0:
  43. case 1:
  44. error = res.message;
  45. break;
  46. default:
  47. error = "未知错误";
  48. }
  49. // 将error信息渲染到页面中
  50. var span = document.createElement("span");
  51. span.innerHTML = error;
  52. form.appendChild(span);
  53. }
  54. };
  55. // 3. 初始化请求参数
  56. xhr.open("POST", "test5.php");
  57. // 4. 使用FormData来组织数据,最终仍是以表单数据方式发送
  58. var data = new FormData(form); //用这种方式取代每个变量的绑定
  59. // data.append("email", form.email.value);
  60. // data.append("passowrd", form.password.value);
  61. // 5. 发送请求, 发送到服务器上的是json格式字符串
  62. xhr.send(data);
  63. };
  64. </script>
  65. </body>
  66. </html>

(test5.php)

  1. <?php
  2. // print_r($_POST);
  3. $users = [
  4. ['id'=>1,'email'=>'peter@php.cn', 'password'=>'123'],
  5. ['id'=>2,'email'=>'peter@qq.com', 'password'=>'888'],
  6. ];
  7. // 上面的数据也可以是从数据库中查询出来然后进行匹对,这个地方直接给更多是为了演示。
  8. $status = 0; $message = '<span style="color:red">邮箱或密码错误</span>';
  9. // $status = 0; $message = '邮箱或密码错误';
  10. foreach ($users as $user) {
  11. if ($user['email'] == $_POST['email'] && $user['password'] == $_POST['password']) {
  12. $status = 1;
  13. $message = '<span style="color:green">验证通过</span>';
  14. // $message = '验证通过';
  15. }
  16. }
  17. echo json_encode(['status'=>$status, 'message'=> $message]);

8. 作业

0812-作业

    1. 将今晚的ajax,json,formdata的相关案例, 在本地至少要写三遍以上(不用提交博客)
    1. 完善最后一个案例, 使用数据表进行用户信息验证,并提交到博客中
  • 下面为php部分,js部分没有太大变化
  1. <?php
  2. // 数据库连接及数据获取部分
  3. $pdo = new PDO('mysql:host=localhost;dbname=liangtest', 'liang', '123456');
  4. $pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
  5. $sql_login = "SELECT `email`, `password` FROM `pro_0member`";
  6. $logins = $pdo->query($sql_login)->fetchAll();
  7. // print_r($logins);
  8. //在实际运营中上面这行不能有,否则会出现错误。奇葩!
  9. $status = 0; $message = '<span style="color:red">邮箱或密码错误</span>';
  10. foreach ($logins as $user) {
  11. if ($user['email'] == $_POST['email'] && $user['password'] == $_POST['password']) {
  12. $status = 1;
  13. $message = '<span style="color:green">验证通过</span>';
  14. // $message = '验证通过';
  15. }
  16. }
  17. echo json_encode(['status'=>$status, 'message'=> $message]);
  18. $pdo = null;
  19. // 最下面这个太关键了,已经要加上,已经要加上,否则出错。
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议