web前端 - 精简系列五:Ajax数据请求和接口测试

201 阅读10分钟

jQuery在线文档

$.ajax数据请求

      // ---------------------- $.get()发起带参数的请求 -----------------------
      $.get(
        'http://www.xiaolongxia.top:3006/api/getbooks',
        { id: 1 },
        function (res) {
          console.log(res); // Object { status: 200, msg: "获取图书列表成功", data: (1) […] }
        }
      );

      // // ---------------------- $.post()发起带参数的请求 -----------------------
      $.post(
        'http://www.xiaolongxia.top:3006/api/addbook',
        {
          id: 5,
          bookname: '小雪人',
          author: '小王子',
          publisher: '北方雪国出版社',
        },
        function (res) {
          console.log(res); //Object { status: 201, msg: "添加图书成功" }
        }
      );

      // --------------------------- $.ajax()发起GET请求 ----------------------------
      $.ajax({
        type: 'GET',
        url: 'http://www.xiaolongxia.top:3006/api/getbooks?id=1',
        success: function (res) {
          console.log(res); //Object { status: 200, msg: "获取图书列表成功", data: (1) […] }
          // console.log(res.data[0].bookname);
        },
      });

      // --------------------------- $.ajax()发起POST请求 ----------------------------
      $.ajax({
        type: 'POST',
        url: 'http://www.xiaolongxia.top:3006/api/addbook',
        data: {
          id: 6,
          bookname: '小雪球',
          author: '小王子',
          publisher: '北方雪国出版社',
        },
        success: function (res) {
          console.log(res); //Object { status: 201, msg: "添加图书成功" }
        },
      });

接口测试工具postman

GET请求

POST请求

接口文档

接口留言案例

<!-- --------------------------- HTML ------------------------------ -->
 <!-- --------------------------- HTML ------------------------------ -->
    <div class="publish">
      <form id="sendForm">
        <span class="fabiao">发表评论</span>
        <div class="comment">
          <div class="comment-list">
            <span>评论人:</span><br />
            <input type="text" name="username" />
          </div>
          <div class="comment-list">
            <span>评论内容:</span><br />
            <textarea id="" cols="50" rows="6" name="content"></textarea>
          </div>
          <input type="submit" value="发表评论" />
        </div>
      </form>
    </div>

    <div class="leave-list">
      <ul>
        <span>留言列表</span>
        <!-- <li>
          <div><span>888888888888888888888888</span></div>
          <div class="leave_date">
            <span>评论人:枝枝花开</span
            ><span>评论时间:2020-11-11-10 20:20:20</span>
          </div>
        </li> -->
      </ul>
    </div>
	// ------------------------------ JS -----------------------------
 // ------------------------------ JS -----------------------------
      // 1:请求数据,将返回的数据渲染到列表中
      function getCommentList() {
        $.ajax({
          type: 'GET',
          url: 'http://www.xiaolongxia.top:3006/api/cmtlist',
          success: function (res) {
            console.log(res);
            if (res.status !== 200) return '数据请求失败';
            var rows = [];
            res.data.forEach(function (item) {
              var li = `<li>
      			<div><span>${item.content}</span></div>
      			<div class="leave_date">
      				<span>评论人:${item.username}</span><span>评论时间:${item.time}</span>
      			</div>
			</li>`;
              rows.push(li);
            });
            $('ul').empty().append(rows.join('')); //先清空表单,再把li渲染到列表中
          },
        });
      }
      
      getCommentList();
      
      // 2:调用接口,实现发表评论功能
      $(function () {
        $('#sendForm').submit(function (e) {
          e.preventDefault();
          var data = $(this).serialize();
          $.ajax({
            type: 'POST',
            url: 'http://www.xiaolongxia.top:3006/api/addcmt',
            data,
            success: function (res) {
              if (res.status !== 201) {
                return alert('数据请求失败');
              }
              getCommentList();
              $('#sendForm')[0].reset(); // 重置表单
            },
          });
        });
      });

模板引擎

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <!-- ------------------- 1:导入jquery和template-web ------------------- -->
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script src="./template-web.js"></script>
  </head>
  <body>
    <!-- ----------------------- 2:指定元素渲染的容器 ---------------------- -->
    <div class="container"></div>

    <!-- ----------------------- 3:指定模板渲染的区域  ------------------------->
    <script type="text/html" id="tpl-demo">
      <!-- 原文输出 -->
      <span>{{name}}</span>
      <!-- 条件输出 -->
      <span>
        {{if flag === 0}} flag的值是0 {{else if flag === 1}} flag的值是1 {{/if}}
      </span>
      <!-- 循环输出 -->
      <ul>
        {{each student}}
        <li>索引是:{{$index}}, 名字是:{{$value}}</li>
        {{/each}}
      </ul>
      <!-- 2:使用格式化时间的过滤器 -->
      <span>{{times | dateFormat}}</span>
    </script>

    <!-- ----------------------- 4:提供数据指定模板区域和渲染容器 ----------------------- -->
    <script>
      //  <!--1:封装格式化时间的过滤器 -->
      template.defaults.imports.dateFormat = function (date) {
        var y = date.getFullYear();
        var m = date.getMonth() + 1;
        var d = date.getDate();
        return y + '-' + m + '-' + d;
			};
			
     // 数据源
      var data = {
        name: 'zs',
        flag: 1,
        student: ['小明', '小李', '小红'],
        times: new Date(),
			};
	 // 使用模板渲染数据,将渲染结果在页面容器上展示
      var htmlStr = template('tpl-demo', data);
      $('.container').html(htmlStr);
    </script>
  </body>
</html>

模板引擎-新闻列表案例

  <body>
    <ul class="news_containr"></ul>

    <script type="text/html" id="tpl_news">
      {{each data}}
      <li>
        <div class="new_img">
          <img src="{{'http://www.xialongxia.top:3006'+$value.img}}" alt="" />
        </div>
        <div class="news">
          <div class="news_detail">
            <h3>{{$value.title}}</h3>
            <div>
              {{each $value.tags}}
              <span>{{$value}}</span>
              {{/each}}
            </div>
          </div>
          <div class="news_date">
            <div class="news_date_fl">
              <span>{{$value.source}}</span>
              <span>{{$value.time}}</span>
            </div>
            <div class="news_date_fl">点赞: {{$value.cmtcount}}</div>
          </div>
        </div>
      </li>
      {{/each}}
    </script>

    <script>
      $(function () {
        template.defaults.imports.dateFormat = function (date) {
          var y = date.getFullYear();
          var m = date.getMonth() + 1;
          var d = date.getDate();
          return y + '-' + m + '-' + d;
        };
        function getList() {
          $.get('http://www.xiaolongxia.top:3006/api/news', function (res) {
            if (res.status !== 200) return alert('数据请求失败');
            console.log(res);
            for (var i = 0; i < res.data.length; i++) {
              res.data[i].tags = res.data[i].tags.split(',');
            }
            var htmlStr = template('tpl_news', res);
            $('.news_containr').html(htmlStr);
          });
        }
        getList();
      });
    </script>
  </body>

正则与字符串操作 exec、replace

      // ---------------------------- exec 查找 -----------------------------
      var str = '<div>{{google}}</div>';
      var yanzen = /{{([a-zA-Z]+)}}/; //  //查找出{{}}双花括号中的字母,返回该文字
      var res = yanzen.exec(str);
      console.log(res); //Array [ "{{google}}", "google" ]
      res = str.replace(res[0], res[1]);
      console.log(res);

      // ------------------------- 字符串的replace ------------------------------
      var str = '<div>{{hello}}</div>';
      var yanz = /{{([a-zA-Z]+)}}/;
      var res = yanz.exec(str);
      res = str.replace(res[0], res[1]);
      console.log(res); // <div>hello</div>

      // ------------------------- 使用while循环进行字符串的replace操作 ---------------------
      var str = '<div>{{name}}今年{{age}}岁了</div>';
      var yanz = /{{\s*([a-zA-Z]+)\s*}}/;

      var res = null;
      while ((res = yanz.exec(str))) {
        str = str.replace(res[0], res[1]);
      }
      console.log(str); //<div>name今年age岁了</div>

      // ------------------------- while和replace将{{}}替换为真值 -----------------------
      var data = { name: 'zs', age: 10 };
      var str = '<div>{{name}}今年{{age}}岁了</div>';
      var yanz = /{{\s*([a-zA-Z]+)\s*}}/;
      var res = null;
      while ((res = yanz.exec(str))) {
        str = str.replace(res[0], data[res[1]]); // 精华在后半句:data[res[1]],替换为真值。
      }
      console.log(str); //<div>zs今年10岁了</div>

xhr

MDN - XMLHttpRequest

      var xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://www.xiaolongxia.top:3006/api/getbooks');
      xhr.send();
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.responseText);
          // {"status":200,"msg":"获取图书列表成功","data":[{"id":1,"bookname":"..."},
        }
      };

      var xhr = new XMLHttpRequest();
      xhr.open('POST', 'http://www.xiaolongxia.top:3006/api/addbook');
      xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
      xhr.send('id=9&bookname=小犀牛&author=阿里巴巴&publisher=淘宝影业');
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.responseText);
        }
      };

      // readyState请求所处的状态
      // 0 对象已经创建, 但未调用 open 方法
      // 1 open 方法已经调用
      // 3 数据接收中, 此时 response 属性中已经包含了部分数据
      // 4 请求完成, 数据彻底完成, 要么成功, 要么失败

查询字符串

JSON-数据交换格式、序列化

我们前端一般是用json格式交换数据
json 就是 jacascript object notation 就是js对象和数组的字符串表示法
JSON的本质就是字符串, 轻量级主流的数据交换格式

json的两种结构
1 对象结构: 属性必须是""引号包裹, 值如果是字符串也必须用""引号包裹, 值 除非是 布尔值和数值可以不用包裹

2 数组结构: 数组中的字符串必须用""引号包裹, 数值用逗号隔开, 一个数组中可以有多个对象, ,或者数组中嵌套数组,但是数组中的字符串还是必须""引号包裹, 数字逗号隔开

JSON语法注意事项
json 语法注意事项
1 属性名必须用""包裹
2 字符串也必须用“”包裹
3 json中不能使用' '单引号
4 json中不能有字符串
5 json外层对象,必须是[ ], 或者是 { }
6 属性值不能是 undefined , 可以是 null ,或者6种数据类型, 61 【字符串, 数值, 布尔值,数组, 对象, null 】
json是用来传输数据的, 用字符串来表示 js 对象或数组数据

      // JSON和JS对象的互转
      // 默认接口返回的数据是一个json字符串,需要用 JSON.parse转换为对象类型

      // 转换的2种方式
      // 1 转换为 json 对象 JSON.parse
      var jsonStr = '{"name":"zs", "age":"20"}';
      var str = JSON.parse(jsonStr);
      console.log(str); //Object { name: "zs", age: "20" }

      // 2 转为 json字符 JSON.stringify
      var str1 = { name: 'zs', age: '20' };
      var jsonStr1 = JSON.stringify(str1);
      console.log(jsonStr1); //{"name":"zs","age":"20"}

      // ----------------------- 将请求回来的数据JSON化 ---------------------
      function getList() {
        var xhr = new XMLHttpRequest();
        xhr.open('GET', 'http://www.xiaolongxia.top:3006/api/getbooks');
        xhr.send();
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            console.log(xhr.responseText);
						console.log(JSON.parse(xhr.responseText)); 
						//Object { status: 200, msg: "获取图书列表成功", data: (5) […] }
          }
        };
      }
      getList();

XHR Level2的新特性、ontimeout、new FormData

  <body>
    <form id="sendFrom">
      <label>用户名:</label>
      <input type="text" value="用户名" name="username" />
      <br />

      <label>密码:</label>
      <input type="password" value="密码" name="password" />

      <input type="submit" value="提交表单" />
    </form>
    <script>
      // xhr.ontimeout 监听是否超时函数, 如果超时则会触发该事件函数
			// xhr.timeout = 30; // 0就会立马执行, 1也会提示,请求超时了!
			
			// ------------------------------ xhr.ontimeout ------------------------------
      var xhr = new XMLHttpRequest();
      xhr.open('GET', 'http://www.xiaolongxia.top:3006/api/getbooks');
      xhr.send();
      xhr.timeout = 30;
      xhr.ontimeout = function () {
        console.log('请求超时了'); ////  请求超时了![后续代码不再执行了,被打断了]
      };
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.responseText);
        }
      };

			// 1: new FormData()创建表单对象, 2:append 向该表单中添加属性, 3:post时将表单携带到后台
			//  new FormData()
			// ------------------------------ 创建 FormData 实例 ------------------------------
      var formData = new FormData();
      formData.append('username', 'zs');
      formData.append('userpwd', '123456');
      var xhr = new XMLHttpRequest();
      xhr.open('POST', 'http://www.xiaolongxia.top:3006/api/formdata');
      xhr.send(formData);
      xhr.onreadystatechange = function () {
        if (xhr.readyState === 4 && xhr.status === 200) {
          console.log(xhr.responseText);
          // {"message":"测试FormData表单提交成功!","data":{"username":"zs","userpwd":"123456"}}
        }
      };

      // 使用FormData快速获取表单中的数据
      // 1. 通过 DOM 操作,获取到 form 表单元素
      var sendForm = document.querySelector('#sendFrom'); // 1: 拿到表单元素
      sendForm.addEventListener('submit', function (e) {
        // 2:监听表单提交事件
        e.preventDefault();
        var fd = new FormData(sendForm); // 3::使用FormData获取表单内容
        var xhr = new XMLHttpRequest();
        xhr.open('POST', 'http://www.xiaolongxia.top:3006/api/formdata');
        xhr.send(fd); // 4: 把表单传给服务器
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            console.log(xhr.responseText);
            // {"message":"测试FormData表单提交成功!","data":{"username":"333","password":"444"}}
          }
        };
      });
    </script>
  </body>

上传文件进度条

  <body>
    <input type="file" id="selectFile" value="选择文件" />
    <br />
    <button id="sendBtn">上传文件</button>
    <div class="jindu"><span id="jdtWidth">0%</span></div>
    <img src="" alt="" />

    <script>
      var btn = document.querySelector('#sendBtn');
      btn.addEventListener('click', function () {
        //1: 点击上传时,拿到选中的图片
        var files = document.querySelector('#selectFile').files;
        if (files.length === 0) {
          return alert('请先选择文件');
        }
        // 2:将选中的图片地址,添加到表单对象中
        var fd = new FormData();
        fd.append('avatar', files[0]);

        var xhr = new XMLHttpRequest();
        // 3:监听onprogress事件,将进度条的宽度和文字设置好
        xhr.upload.onprogress = function (e) {
          var jinduW = Math.ceil((e.loaded / e.total) * 100);
          $('#jdtWidth')
            .attr('style', 'width:' + jinduW + '%')
            .html(jinduW + '%');
        };
        // 4:监听onload事件,进度条加载完成,改变成绿色
        xhr.upload.onload = function () {
          $('#jdtWidth').removeClass().addClass('ok');
        };
        // 5:请求接口,将表单发送给服务器,在onreadystatechange中判断,成功就设置img,否则提示失败
        xhr.open('POST', 'http://www.xiaolongxia.top:3006/api/upload/avatar');
        xhr.send(fd);
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4 && xhr.status === 200) {
            var data = JSON.parse(xhr.responseText);
            if (xhr.status === 200) {
              document.querySelector('img').src =
                'http://www.xiaolongxia.top:3006' + data.url;
            } else {
              alert('文件上传失败!' + data.message);
            }
          }
        };
      });
    </script>
  </body>

axios中文文档

      // ---------------------- GET -------------------------
      // 唯一区别: GET是通过params在发送参数的, 而POST是通过data发送参数的
      function getMsg() {
        axios({
          method: 'GET',
          url: 'http://www.xiaolongxia.top:3006/api/get',
          params: {
            name: 'zs',
            age: 18,
          },
        }).then(function (res) {
          console.log(res.data);
          // Object { message: "GET请求测试成功", ​data: Object { name: "zs", age: "18" }}
        });
      }
      getMsg();

      // ---------------------- POST -------------------------
      function getPost() {
        axios({
          method: 'POST',
          url: 'http://www.xiaolongxia.top:3006/api/post',
          data: {
            bookname: 'ls',
            price: 14,
          },
        }).then(function (res) {
          console.log(res.data);
          // Object { message: "POST请求测试成功", data: Object { bookname: "ls", price: 14 } }
        });
      }
      getPost();

同源策略 +跨域

同源策略
同源就是: 端口,域名,协议, 3者都相同,才叫同源, 如有一个不一样,都属于不同源
同源策略:是浏览器的一种安全功能,目的就是不让a操作b的cookie,和本地存储,以及数据交互。无法接触的非同源的 DOM, 无法向非同源的地址发送ajax请求

什么是跨域
端口,协议,域名,一者不同就属于跨域,浏览器是不允许跨域请求数据的
浏览器对跨域的拦截:
浏览器能发出去,服务器也会把数据返回来, 但是返回来的数据会被同源策略拦截到,所以页面无法获取数据

如何实现跨域数据请求

实现跨域的2中方式
jsonp 只支持get请求
cors 是w3c标准的,不支持低版本浏览器,跨域get和pos

<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8" />
    <title>JSONP 实例</title>
    <script src="https://cdn.static.runoob.com/libs/jquery/1.8.3/jquery.js"></script>
  </head>
  <body>
<!-- 很简单,就是利用<script>标签没有跨域限制的“漏洞”(历史遗迹啊),来达到与第三方通讯的目的。当需要通讯时,

1:本站脚本创建一个<script>元素,地址指向第三方的API网址,
如:<script src="https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"></script>  
并提供一个回调函数来接收数据(函数名可约定,或通过地址参数传递)。   
第三方产生的响应为json数据的包装(故称之为jsonp,即json padding),

2::这样浏览器会调用callback函数,
并传递解析后json对象作为参数。本站脚本可在callback函数里处理所传入的数据。
function callbackFunction(result) {}

补充:“历史遗迹”的意思就是,如果在今天重新设计的话,也许就不会允许这样简单的跨域了嘿,
比如可能像XHR一样按照CORS规范要求服务器发送特定的http头。 -->

    <div id="divCustomers"></div>

<!-- ---------------------------------JS 回调函数方式 ----------------------------------- -->
    <script type="text/javascript">
      function callbackFunction(result) {
        var html = '<ul>';
        for (var i = 0; i < result.length; i++) {
          html += '<li>' + result[i] + '</li>';
        }
        html += '</ul>';
        document.getElementById('divCustomers').innerHTML = html;
      }
    </script>
    <script
      type="text/javascript"
      src="https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=callbackFunction"
    ></script>

<!-- ----------------------------- jQuery - $.getJSON方式 ----------------------------- -->
<script>
      $.getJSON(
        'https://www.runoob.com/try/ajax/jsonp.php?jsoncallback=?',
        function (data) {
          console.log(data);
          var html = '<ul>';
          for (var i = 0; i < data.length; i++) {
            html += '<li>' + data[i] + '</li>';
          }
          html += '</ul>';

          $('#divCustomers').html(html);
        }
      );
</script>
		
<!-- 总结:利用<script>标签可以跨域,让服务器端返回可执行的Javascript函数,参数为要回发的数据。
json 是一种数据格式
jsonp 是一种数据调用的方式。
你可以简单的理解为 带callback的json就是jsonp.
-->
  </body>
</html>

防抖和节流

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
    <script src="https://cdn.staticfile.org/jquery/1.10.2/jquery.min.js"></script>
    <script src="./template-web.js"></script>
  </head>
  <body>
    <input type="text" />
    <ul id="searchList"></ul>
    <img src="../image/哪吒.jpg" alt="" /> // position: absolute
 
<!-- ---------------------------- 搜索列表案例---------------------------- -->
    <script type="text/html" id="tpl-list">
      {{ each result}}
      <li>{{$value[0]}}</li>
      {{ /each }}
    </script>
    
    <script>
      // 防抖就是,事件触发后, 延迟n秒再执行回调
      // 现实中的防抖, 就如输入框一样, 每个字母都触发了数据请求
      var timer = null;
      var cacheObj = {};
      // 5:防抖函数,让请求半秒请求数据接口一次
      function fangdou(kw) {
        timer = setTimeout(function () {
          getList(kw);
        }, 500);
      }

      // 4:输入框事件,停止防抖,如果没输入就不显示列表,如果缓存中有关键词,就根据缓存关键词渲染列表
      $('input').on('keyup', function () {
        clearTimeout(timer);
        var val = $(this).val().trim();
        if (val.length <= 0) {
          console.log('hide1');
          return $('ul').empty().hide();
        }
        // 3.1:如果缓存中有数据,就渲染缓存中的
        if (cacheObj[val]) {
          return rendList(cacheObj[val]);
        }
        // 4.1: 调用防抖函数
        fangdou(val);
      });

      // 1: 获取接口数据, 在请求地址中携带kw查询关键字
      function getList(kw) {
        $.ajax({
          url: 'https://suggest.taobao.com/sug?q=' + kw,
          dataType: 'jsonp',
          success: function (res) {
            // 1.1: 查询到数据,就渲染数据
            rendList(res);
          },
        });
      }

      // 2:渲染数据,如果没有请求到数据就隐藏ul,有数据就是有模板加工和数据,展示到页面容器中
      function rendList(res) {
        if (res.result.length <= 0) {
          console.log('hide2');
          return $('ul').empty().hide();
        }
        var htmlStr = template('tpl-list', res);
        $('#searchList').html(htmlStr).show();

        // 3:拿到输入框中的数据,并缓存
        var k = $('input').val().trim();
        cacheObj[k] = res;
        console.log(cacheObj[k]);
      }
      
// ------------------------------ 节流 [图片跟随鼠标]------------------------------
      $(function () {
        var timeId = null;
        $(document).on('mousemove', function (e) {
          if (timeId) {
            return;
          }
          timeId = setTimeout(function () {
            $('img')
              .css('top', e.pageY - 25 + 'px')
              .css('left', e.pageX - 25 + 'px');
            timeId = null;
          }, 16);
        });
      });
    </script>
  </body>
</html>

总结:
防抖:不管点了多少次,只会触发最后一次
节流:减少事件触发的频率, 因此节流是 有选择性的 执行一部分事件

Http

响应消息

响应消息 有4部分组成
状态行 响应头部  响应体

---------------------- 状态行 ----------------------------
状态行 的 3个组成部分
协议版本 HTTP/1.1
状态码  200
状态码描述  OK

---------------------- 响应头部 ----------------------------
响应头部就是用来描述 服务器的基本信息
常见字段看图

---------------------- 响应体 ----------------------------
响应体 就是服务器响应给客户端的资源内容 【response】

HTTP请求方法

---------------------- HTTP请求方法 ----------------------------
get 查询
post 新增
put 修改
delete 删除

---------------------- HTTP响应状态码 ----------------------------
HTTP响应状态码 用来标识响应的状态
通过状态码就能知道是成功 或者失败了
状态码 200 标识成功 。 ok 状态描述
状态码是由 3个十进制的数字组成, 第一个状态码用来定义状态码类型。  后面的2个状态码用来细分。 总共分为 5种类型
1** 很少遇到 
2** 成功
3** 重定向, 需要进一步操作以完成请求
4** 客户端错误, 请求语法错误,或者 无法完成请求
5** 服务器端错误, 服务器在处理请求是发生了错误

---------------------- 2xx成功相关的响应状态码 ----------------------------
2xx成功相关的响应状态码
2** 一把表示 成功
200 表示 成功,一般是get 或者 post请求
201 已创建, 一般是 修改和创建 psot和put

---------------------- 3xx重定向相关的响应状态码 ----------------------------
3xx重定向相关的响应状态码
3** 重定向相关
表示服务器要求客户端重定向, 需要客户端进一步操作完成资源的请求
301: 永久移动【资源已被移动到新的URL, 今后任何新的请求都需要使用新的URL代替】
302: 临时移动 与301类似, 但资源只是临时移动, 客户端应继续使用原有的URL
303: 未修改:所请求的资源未修改, 服务器返回此状态码时,不会返回任何资源(响应消息中不不含响应体) 客户端通常会缓存访问过的资源

---------------------- 4xx客户端错误相关的响应状态码 ----------------------------
4xx客户端错误相关的响应状态码
4** 客户端相关 错误
400  语义有误, 请求参数有误
401 当前需要用户验证
403 服务器已经理解请求, 但是拒绝执行他【比如跨域】
404: 服务器无法根据客户端的请求找到资源
405:请求超时, 服务器等待客户端发送的请求事件过长, 超时,服务器直接响应超时

---------------------- 5xx服务端错误相关的响应状态码 ----------------------------
5xx服务端错误相关的响应状态码
5** 客户端相关错误
500: 服务器内部错误, 无法完成请求
501 服务器不支持该请求方法, 只有gethead 请求方法是要求每个服务器必须支持的, 其他请求方法不支持服务器上会返回 501
503 由于超载或者系统维护, 服务器暂时的无法处理刻画单的请求

Git

.gitignore文件忽略

.gitignore使用示例

1: .gitignore文件忽略的使用参数详解
2: 在当前项目下新建.gitignore文件, 只要写在该文件里面的忽略项, 忽略项都不会被git检测到, 但是git能检测

Git 版本回退、合并冲突

回退到指定的版本
git log --pretty=oneline 提交历史记录
git reset --hard 拷贝 想要回退的版本号【回到某个年龄段,该年龄发生的文件都会删除消失】
git reflog --pretty=oneline 【注意因为回到了最初版本,通过git log --pretty=oneline中只能看到自己的提交记录, 往后发生的都已经看不到了, 只能通过reflog才能看到】
git reset --hard 拷贝要回退的版本号,【由于我们拷贝的是最后一次提交, 所以git log,能够看到该项目之前所有的提交记录了!】

遇到冲突时的分支合并
合并冲突: 冲突的形成原因(由于2条分支修改了同一个文件, 各自修改后都能提交到本地仓库中, 【冲突开始来了】在主分支上讲用户a合并能成功,因为先到, 但是在主分支上合并后一个分支:自动合并失败;请修复冲突,然后提交结果。 )
此时打开vscode,会自动打开报错的这个文件,可以点击采用谁的, 就会保留谁的。 合并后再次提交到本地仓库中

Git 总结

git 基本使用命令: 
git init 创建本地仓库
git add . 将修改的文件添加到本地存储中
git commit -m '版本记录描述信息'

git创建和维护远程仓库
1: 生成 ssh Key, 在把 ssh Key添加到github中
2:能够把本地仓库上传到 github中

能够掌握git分支的基本使用
git checkout -b  新建本地分支名称
git push -u origin 新增远程分支名称
git checkout 分支名称  【切换名称】
git branch  查看分支

github

连接远程仓库的两种方式

生成和配置SSH key秘钥

git clone

----------------------- 连接远程仓库的两种方式 ------------------------
git push命令的作用

我们再次对自己项目开发了一些功能, 第二次提交就不用像第一次提交那么麻烦了, 
将本地项目提交掉本地仓库中后直接: git push 就直接推送成功了【因为已经被记住了】

----------------------- 生成和配置SSH key秘钥------------------------
生成SSH key
SSH Key 钥匙生成
打开 git bash 运行如下命令: ssh-keygen -t rsa -b 4096 -C "该github账号的注册邮箱"
再连续按 3次回车
会在 C盘/user/Administratar/.ssh/ 会生成 .ssh文件夹,里面就有 id_rsa 私钥【放电脑中】    id_rsa.pub公钥,需要配置到Github中

检查 sshkey 是否配置成功
1: 在 Git base here 中输入:ssh -T git@github.com
2: 回复 yes , 当看到 Hi  你的用户名,就表示配置成功了

----------------------- git clone ------------------------
将远程仓库克隆到本地
将github项目克隆到自己电脑中
1; 打开项目 --> Code ---> Clone with SSH --->拷贝该地址
2: 在电脑中打开 git base here --> git clone ssh克隆地址
3: 克隆完成页面就多了该项目文件夹, 全套克隆了

下一篇:后端-Node系列一:node.js基础