大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新......

在这里我会从 Web 前端零基础开始,一步步学习 Web 相关的知识点,期间也会分享一些好玩的项目。现在就让我们一起进入 Web 前端学习的冒险之旅吧!

接口文档的使用

需求:使用接口文档验证用户名、邮箱、手机的唯一性

接口文档

当前端界面需要从服务器获取数据的时候,其实就是眼访问一个 URL 地址,指定特定的参数即可。这个 URL 对应的是 php 或者 jsp 等都是服务器开发人员已经开发好了。服务器开发人员开发好相关的接口之后,会提供一份接口文档给前端开发人员,在接口中会详细说明你要获取什么数据,访问什么地址,传入什么参数等等内容,下面就是一个简单接口文档的内容:

验证用户名唯一性的接口

地址 /server/checkUsername.php
作用描述 验证用户名是否可用
请求类型 get 请求
参数 uname
返回的数据格式 普通字符串
返回数据说明 返回 ok:代表用户名可用; 返回 error:代表用户名不可用。

验证邮箱唯一性的接口

地址 /server/checkEmail.php
作用描述 验证邮箱是否可用
请求类型 post 请求
参数 e
返回的数据格式 数字
返回数据说明 返回 0:代表邮箱可用; 返回 1:代表邮箱不可用。

验证手机号唯一性的接口

地址 /server/checkPhone.php
作用描述 验证手机号是否可用
请求类型 post 请求
参数 phonenumber
返回的数据格式 json格式
返回数据说明 如下:
  1. 手机号可用情况下返回如下:
  2. {
  3. "status":0,
  4. "message":{
  5. "tips":"手机号可用",
  6. "phonefrom":"中国电信"
  7. }
  8. }
  9. 手机号不可用情况下返回如下:
  10. {
  11. "status":1,
  12. "message":"手机号已被注册"
  13. }

示例代码

  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. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="dv">
  11. <h1>用户注册</h1>
  12. 用户名:<input type="text" name="username"><span id="user-span"></span><br>
  13. 邮箱:<input type="text" name="email"><span id="email-span"></span><br>
  14. 手机:<input type="text" name="phone"><span id="phone-span"></span><br>
  15. </div>
  16. <script>
  17. // 获取所有元素
  18. var userObj = document.getElementsByName("username")[0];
  19. var emailObj = document.getElementsByName("email")[0];
  20. var phoneObj = document.getElementsByName("phone")[0];
  21. var userSpanObj = document.getElementById("user-span");
  22. var emailSpanObj = document.getElementById("email-span");
  23. var phoneSpanObj = document.getElementById("phone-span");
  24. //用户名文本框失去焦点事件
  25. userObj.onblur = function () {
  26. // 获取文本内容
  27. var userText = this.value;
  28. var xhr = new XMLHttpRequest();
  29. xhr.open("get", "./server/checkUsername.php?uname="+userText, true);
  30. xhr.send(null);
  31. xhr.onreadystatechange = function () {
  32. if(this.readyState == 4) {
  33. if(this.status == 200) {
  34. if(this.responseText == "ok") {
  35. userSpanObj.innerHTML = "用户名可用";
  36. } else if(this.responseText == "error") {
  37. userSpanObj.innerHTML = "用户名不可用";
  38. }
  39. }
  40. }
  41. };
  42. };
  43. //邮箱文本框失去焦点事件
  44. emailObj.onblur = function () {
  45. // 获取文本内容
  46. var emailText = this.value;
  47. var xhr = new XMLHttpRequest();
  48. xhr.open("post", "./server/checkEmail.php", true);
  49. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  50. xhr.send("e="+emailText);
  51. xhr.onreadystatechange = function () {
  52. if(this.readyState == 4) {
  53. if(this.status == 200) {
  54. console.log(this.responseText);
  55. if(this.responseText == 0) {
  56. emailSpanObj.innerHTML = "邮箱可用";
  57. } else if(this.responseText == 1) {
  58. emailSpanObj.innerHTML = "邮箱不可用";
  59. }
  60. }
  61. }
  62. };
  63. };
  64. //手机号文本框失去焦点事件
  65. phoneObj.onblur = function () {
  66. // 获取文本内容
  67. var phoneText = this.value;
  68. var xhr = new XMLHttpRequest();
  69. xhr.open("post", "./server/checkPhone.php", true);
  70. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  71. xhr.send("phonenumber="+phoneText);
  72. xhr.onreadystatechange = function () {
  73. if(this.readyState == 4) {
  74. if(this.status == 200) {
  75. var val = JSON.parse(this.responseText);
  76. // console.log(val.status);
  77. if(val.status == 0) {
  78. phoneSpanObj.innerHTML = val.message.tips + " " + val.message.phonefrom;
  79. } else if(val.status == 1) {
  80. phoneSpanObj.innerHTML = val.message;
  81. }
  82. }
  83. }
  84. };
  85. };
  86. </script>
  87. </body>
  88. </html>

书写以上代码的过程中,完全不需要查看对应的 php 文件,只需要查看接口文档就可以搞定。

代码第一步封装

上面验证用户名,邮箱和手机号的时候,都是使用的 Ajax 的四部操作,有很多代码冗余,所以将 Ajax 的四步操作封装在一个函数中很有必要的。

  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. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="dv">
  11. <h1>用户注册</h1>
  12. 用户名:<input type="text" name="username"><span id="user-span"></span><br>
  13. 邮箱:<input type="text" name="email"><span id="email-span"></span><br>
  14. 手机:<input type="text" name="phone"><span id="phone-span"></span><br>
  15. </div>
  16. <script>
  17. // Ajax 四步操作的封装函数
  18. function myAjax(type, url, param, async, dataType, callback) {
  19. var xhr = null;
  20. // 兼容性处理
  21. if(window.XMLHttpRequest) {
  22. xhr = new XMLHttpRequest();
  23. } else {
  24. xhr = new ActiveXObject("Microsoft.XMLHTTP");
  25. }
  26. if((type == "get") || (type == "GET")) {
  27. if(param && param != "") {
  28. url += "?" + param;
  29. }
  30. xhr.open(type, url, async);
  31. xhr.send(null);
  32. } else if((type == "post") || (type == "POST")) {
  33. xhr.open(type, url, async);
  34. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  35. xhr.send(param);
  36. }
  37. if(async) {
  38. xhr.onreadystatechange = function () {
  39. if(this.readyState == 4) {
  40. if(this.status == 200) {
  41. if(dataType == "xml") {
  42. callback(this.responseXML);
  43. } else if(dataType == "json") {
  44. callback(JSON.parse(this.responseText));
  45. } else {
  46. callback(this.responseText);
  47. }
  48. }
  49. }
  50. };
  51. } else {
  52. if(this.readyState == 4) {
  53. if(this.status == 200) {
  54. if(dataType == "xml") {
  55. callback(this.responseXML);
  56. } else if(dataType == "json") {
  57. callback(JSON.parse(this.responseText));
  58. } else {
  59. callback(this.responseText);
  60. }
  61. }
  62. }
  63. }
  64. }
  65. // 获取所有元素
  66. var userObj = document.getElementsByName("username")[0];
  67. var emailObj = document.getElementsByName("email")[0];
  68. var phoneObj = document.getElementsByName("phone")[0];
  69. var userSpanObj = document.getElementById("user-span");
  70. var emailSpanObj = document.getElementById("email-span");
  71. var phoneSpanObj = document.getElementById("phone-span");
  72. //用户名文本框失去焦点事件
  73. userObj.onblur = function () {
  74. // 获取文本内容
  75. var userText = this.value;
  76. myAjax("get", "./server/checkUsername.php", "uname="+userText, "true", "text", function (result) {
  77. if(result == "ok") {
  78. userSpanObj.innerHTML = "用户名可用";
  79. } else if(result == "error") {
  80. userSpanObj.innerHTML = "用户名不可用";
  81. }
  82. });
  83. };
  84. //邮箱文本框失去焦点事件
  85. emailObj.onblur = function () {
  86. // 获取文本内容
  87. var emailText = this.value;
  88. myAjax("post", "./server/checkEmail.php", "e="+emailText, "true", "text", function (result) {
  89. if(result == 0) {
  90. emailSpanObj.innerHTML = "邮箱可用";
  91. } else if(result == 1) {
  92. emailSpanObj.innerHTML = "邮箱不可用";
  93. }
  94. });
  95. };
  96. //手机号文本框失去焦点事件
  97. phoneObj.onblur = function () {
  98. // 获取文本内容
  99. var phoneText = this.value;
  100. myAjax("post", "./server/checkPhone.php", "phonenumber="+phoneText, "true", "json", function (result) {
  101. if(result.status == 0) {
  102. phoneSpanObj.innerHTML = result.message.tips + " " + result.message.phonefrom;
  103. } else if(result.status == 1) {
  104. phoneSpanObj.innerHTML = result.message;
  105. }
  106. });
  107. };
  108. </script>
  109. </body>
  110. </html>

仍然存在的问题:

1、参数的顺序不可改变;

2、参数没有默认值,所有的参数必须传递。

代码进一步封装

将需要传入的参数做成一个对象,这个对象所有的有默认参数,如果没有传入一些参数的话,使用默认参数代替;如果传入了相关参数,则覆盖掉默认参数。

  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. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. </head>
  9. <body>
  10. <div id="dv">
  11. <h1>用户注册</h1>
  12. 用户名:<input type="text" name="username"><span id="user-span"></span><br>
  13. 邮箱:<input type="text" name="email"><span id="email-span"></span><br>
  14. 手机:<input type="text" name="phone"><span id="phone-span"></span><br>
  15. </div>
  16. <script>
  17. function myAjax2(obj) {
  18. var defaults = {
  19. type: "get",
  20. url: "#",
  21. dataType: "",
  22. data: {}, // 参数有可能多个,用对象保存
  23. async: true,
  24. success: function (result) {
  25. console.log(result);
  26. }
  27. };
  28. for(var key in obj) {
  29. defaults[key] = obj[key];
  30. }
  31. var xhr = null;
  32. if(window.XMLHttpRequest) {
  33. xhr = new XMLHttpRequest();
  34. } else {
  35. xhr = new ActiveXObject("Microsoft.XMLHTTP");
  36. }
  37. var param = "";
  38. for(var attr in defaults.data) {
  39. param += attr + "=" + defaults.data[attr] + "&" // 比如:uname=zhangsan&pwd=123
  40. }
  41. // 最后一个参数后面去掉 &
  42. if(param) {
  43. param = param.substring(0, param.length-1);
  44. }
  45. if((defaults.type == "get") || (defaults.type == "GET")) {
  46. defaults.url += "?" + param;
  47. }
  48. xhr.open(defaults.type, defaults.url, defaults.async);
  49. if((defaults.type == "get") || (defaults.type == "GET")) {
  50. xhr.send(null);
  51. } else if((defaults.type == "post") || (defaults.type == "POST")) {
  52. xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  53. xhr.send(param);
  54. }
  55. if(defaults.async) {
  56. xhr.onreadystatechange = function () {
  57. if(this.readyState == 4) {
  58. if(this.status == 200) {
  59. if(defaults.dataType == "xml") {
  60. defaults.success(this.responseXML);
  61. } else if(defaults.dataType == "json") {
  62. defaults.success(JSON.parse(this.responseText));
  63. } else {
  64. defaults.success(this.responseText);
  65. }
  66. }
  67. }
  68. };
  69. } else {
  70. if(this.readyState == 4) {
  71. if(this.status == 200) {
  72. if(defaults.dataType == "xml") {
  73. defaults.success(this.responseXML);
  74. } else if(defaults.dataType == "json") {
  75. defaults.success(JSON.parse(this.responseText));
  76. } else {
  77. defaults.success(this.responseText);
  78. }
  79. }
  80. }
  81. }
  82. }
  83. // 获取所有元素
  84. var userObj = document.getElementsByName("username")[0];
  85. var emailObj = document.getElementsByName("email")[0];
  86. var phoneObj = document.getElementsByName("phone")[0];
  87. var userSpanObj = document.getElementById("user-span");
  88. var emailSpanObj = document.getElementById("email-span");
  89. var phoneSpanObj = document.getElementById("phone-span");
  90. //用户名文本框失去焦点事件
  91. userObj.onblur = function () {
  92. myAjax2({
  93. url: "./server/checkUsername.php",
  94. type: "get",
  95. data: {uname: this.value},
  96. success: function (result) {
  97. if(result == "ok") {
  98. userSpanObj.innerHTML = "用户名可用";
  99. } else if(result == "error") {
  100. userSpanObj.innerHTML = "用户名不可用";
  101. }
  102. }
  103. });
  104. };
  105. //邮箱文本框失去焦点事件
  106. emailObj.onblur = function () {
  107. myAjax2({
  108. url: "./server/checkEmail.php",
  109. type: "post",
  110. data: {e: this.value},
  111. success: function (result) {
  112. if(result == 0) {
  113. emailSpanObj.innerHTML = "邮箱可用";
  114. } else if(result == 1) {
  115. emailSpanObj.innerHTML = "邮箱不可用";
  116. }
  117. }
  118. });
  119. };
  120. //手机号文本框失去焦点事件
  121. phoneObj.onblur = function () {
  122. myAjax2({
  123. url: "./server/checkPhone.php",
  124. type: "post",
  125. dataType: "json",
  126. data: {phonenumber: this.value},
  127. success: function (result) {
  128. if(result.status == 0) {
  129. phoneSpanObj.innerHTML = result.message.tips + " " + result.message.phonefrom;
  130. } else if(result.status == 1) {
  131. phoneSpanObj.innerHTML = result.message;
  132. }
  133. }
  134. });
  135. };
  136. </script>
  137. </body>
  138. </html>

进一步封装后的函数为: myAjax2({}); 里面是一个对象。使用默认对象的方式,不仅可以解决传入参数顺序不一致的问题;还可以解决不传参数时默认值的问题。

从零开始学 Web 之 Ajax(四)接口文档,验证用户名唯一性案例的更多相关文章

  1. 从零开始学 Web 之 Ajax(五)同步异步请求,数据格式

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  2. 从零开始学 Web 之 Ajax(七)跨域

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  3. 从零开始学 Web 之 Ajax(二)PHP基础语法

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  4. 从零开始学 Web 之 Ajax(三)Ajax 概述,快速上手

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  5. 从零开始学 Web 之 Ajax(六)jQuery中的Ajax

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  6. 从零开始学 Web 之 Ajax(一)服务器相关概念

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新...... github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:ht ...

  7. Web API 自动生成接口文档

    1.添加NuGet程序包 Microsoft ASP.NET Web API 2.2 Help Page      (这是微软官方的) A Simple Test Client for ASP.NET ...

  8. Asp.Net Core 轻松学-利用 Swagger 自动生成接口文档

    前言     目前市场上主流的开发模式,几乎清一色的前后端分离方式,作为服务端开发人员,我们有义务提供给各个客户端良好的开发文档,以方便对接,减少沟通时间,提高开发效率:对于开发人员来说,编写接口文档 ...

  9. 从零开始学 Web 系列教程

    大家好,这里是「 从零开始学 Web 系列教程 」,并在下列地址同步更新…… github:https://github.com/Daotin/Web 微信公众号:Web前端之巅 博客园:http:/ ...

随机推荐

  1. swift hidesBottomBarWhenPushed 设置界面

    方法一(推荐):一级界面push的时候设置,子页面无需设置 let vc = JYMyCommissionController() vc.hidesBottomBarWhenPushed = true ...

  2. Quartz.Net进阶之一:初识Job作业和触发器

        前几天写了一篇有关Quartz.Net入门的文章,大家感觉不过瘾,想让我在写一些比较深入的文章.其实这个东西,我也是刚入门,我也想继续深入了解一下,所以就努力看了一些资料,然后自己再整理和翻译 ...

  3. day3-selenium的使用及

    如果是python2的情况下需要设置: # _*_ coding:utf-8 _*_,这样的编码来保证输入中文在运行时不会报错,另外在中文的前边加上u保证编译时不会报错 from selenium i ...

  4. POJ 1655.Balancing Act 树形dp 树的重心

    Balancing Act Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 14550   Accepted: 6173 De ...

  5. Oracle使用JDBC进行增删改查 表是否存在

    Oracle使用JDBC进行增删改查 数据库和表 table USERS (   USERNAME VARCHAR2(20) not null,   PASSWORD VARCHAR2(20) ) a ...

  6. 2019.02.19 bzoj2655: calc(生成函数+拉格朗日插值)

    传送门 题意简述:问有多少数列满足如下条件: 所有数在[1,A][1,A][1,A]之间. 没有相同的数 数列长度为nnn 一个数列的贡献是所有数之积,问所有满足条件的数列的贡献之和. A≤1e9,n ...

  7. centos 7下 django 1.11 + nginx 1.12 + uwsgi 2.0

    之前写过一个博客关于如何安装django的,见下网址, http://www.cnblogs.com/qinhan/p/8732626.html 还有一个网址如何安装nginx的 http://www ...

  8. Maths | 离散K-L变换/ 主成分分析法

    目录 1. 概述 2. K-L变换方法和原理推导 2.1. 向量分解 2.2. 向量估计及其误差 2.3. 寻找最小误差对应的正交向量系 3. K-L变换高效率的本质 4. PCA在编.解码应用上的进 ...

  9. Android -Services 使用简介

    Android Services 四大组件之一,主要用于后台长时间运行.没有界面.这里讲解两种services的启动还有AIDL通信方式. 1.startservices a.建立继承services ...

  10. jsp和html的区别

    html是超文本标记语言,只要有浏览器,就可以显示出来了. jsp是java server page就是在java服务器端的页面,需要通过jdk的编译才可以显示在客户端的浏览器上. 不仅如此,jsp还 ...