Vue之前后端交互

一、前后端交互模式

接口调用方式
  • 原生ajax
  • 基于jQuery的ajax
  • fetch
  • axios
异步
  • JavaScript的执行环境是「单线程」
  • 所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,它会「阻塞」其他任务。这个任务可称为主线程
  • 异步模式可以一起执行多个任务,但多次异步调用的顺序不确定,不是按照我们写代码的顺序得到结果
  • 如果异步调用结果存在依赖,代码需要嵌套
  • JS中常见的异步调用
    • 定时任务
    • ajax
    • 事件函数

二、promise(类型是构造函数)

  • 主要解决异步深层嵌套的问题(回调地狱)
  • promise 提供了简洁的API ,使得异步操作更加容易

2.1 Promise的基本用法

  1. <script type="text/javascript">
  2. /*
  3. 1. Promise基本使用
  4. 我们使用new来构建一个Promise。
  5. Promise的构造函数接收一个参数,该函数用于处理异步任务。
  6. 并且传入两个参数:resolve,reject,分别表示异步操作执行成功后的回调函数和异步操作执行失败后的回调函数
  7. */
  8. var p = new Promise(function(resolve, reject){
  9. //2. 这里用于实现异步任务 setTimeout
  10. setTimeout(function(){
  11. var flag = false;
  12. if(flag) {
  13. //3. 正常情况
  14. resolve('hello');
  15. }else{
  16. //4. 异常情况
  17. reject('出错了');
  18. }
  19. }, 100);
  20. });
  21. // 5 Promise实例生成以后,可以用then方法指定resolved状态和reject状态的回调函数
  22. // 在then方法中,你也可以直接return数据而不是Promise对象,在后面的then中就可以接收到数据了
  23. p.then(function(data){
  24. console.log(data)
  25. },function(info){
  26. console.log(info)
  27. });
  28. </script>

2.2 基于Promise发送Ajax请求

  1. <script type="text/javascript">
  2. function queryData(url) {
  3. # 1.1 创建一个Promise实例
  4. return new Promise(function(resolve, reject){
  5. var xhr = new XMLHttpRequest();
  6. xhr.onreadystatechange = function(){
  7. if(xhr.readyState != 4) return;
  8. if(xhr.readyState == 4 && xhr.status == 200) {
  9. # 1.2 处理正常的情况
  10. resolve(xhr.responseText);
  11. }else{
  12. # 1.3 处理异常情况
  13. reject('服务器错误');
  14. }
  15. };
  16. xhr.open('get', url);
  17. xhr.send(null);
  18. });
  19. }
  20. # 注意: 这里需要开启一个服务
  21. # 发送多个ajax请求并保证顺序
  22. # then方法中,你也可以直接return数据而不是Promise对象,当前then会产生一个默认的Promise对象,因此在后面的then中的函数参数中接收到就是该数据
  23. queryData('http://localhost:3000/data')
  24. .then(function(data){
  25. console.log(data)
  26. # 1.4 想要继续链式编程下去 需要 return
  27. return queryData('http://localhost:3000/data1');
  28. })
  29. .then(function(data){
  30. console.log(data);
  31. return queryData('http://localhost:3000/data2');
  32. })
  33. .then(function(data){
  34. console.log(data);
  35. return 'hello'
  36. })
  37. .then(function(data){
  38. console.log(data);//hello
  39. });
  40. </script>

2.3 Promise 基本API

实例方法(位于Promise对象的原型prototype中,只能通过实例调用)
  • .then() 得到异步任务正确的结果

  • .catch() 获取异常信息

  • .finally() 成功与否都会执行(不是正式标准)

  1. <script type="text/javascript">
  2. /*
  3. Promise常用API-实例方法
  4. */
  5. console.dir(Promise);
  6. function foo() {
  7. return new Promise(function(resolve, reject){
  8. setTimeout(function(){
  9. // resolve(123);
  10. reject('error');
  11. }, 100);
  12. })
  13. }
  14. // foo()
  15. // .then(function(data){
  16. // console.log(data)
  17. // })
  18. // .catch(function(data){
  19. // console.log(data)
  20. // })
  21. // .finally(function(){
  22. // console.log('finished')
  23. // });
  24. // --------------------------
  25. // 两种写法是等效的
  26. foo()
  27. .then(function(data){
  28. # 得到异步任务正确的结果
  29. console.log(data)
  30. },function(data){
  31. # 获取异常信息
  32. console.log(data)
  33. })
  34. # 成功与否都会执行(不是正式标准)
  35. .finally(function(){
  36. console.log('finished')
  37. });
  38. </script>
静态方法
.all()
  • Promise.all并发处理多个异步任务,所有任务执行完才能得到结果。

    方法接受一个数组作参数,数组中的对象(p1、p2、p3)均为promise实例(如果不是一个promise,该项会被用Promise.resolve转换为一个promise)。它的状态由这三个promise实例决定。
.race()
  • Promise.race并发处理多个异步任务,只要有一个任务执行完就你能得到结果。

    方法同样接受一个数组作参数。当p1, p2, p3中有一个实例的状态发生改变(变为fulfilledrejected),p的状态就跟着改变。并把第一个改变状态的promise的返回值,传给p的回调函数
  1. <script type="text/javascript">
  2. /*
  3. Promise常用API-对象方法
  4. */
  5. // console.dir(Promise)
  6. function queryData(url) {
  7. return new Promise(function(resolve, reject){
  8. var xhr = new XMLHttpRequest();
  9. xhr.onreadystatechange = function(){
  10. if(xhr.readyState != 4) return;
  11. if(xhr.readyState == 4 && xhr.status == 200) {
  12. // 处理正常的情况
  13. resolve(xhr.responseText);
  14. }else{
  15. // 处理异常情况
  16. reject('服务器错误');
  17. }
  18. };
  19. xhr.open('get', url);
  20. xhr.send(null);
  21. });
  22. }
  23. var p1 = queryData('http://localhost:3000/a1');
  24. var p2 = queryData('http://localhost:3000/a2');
  25. var p3 = queryData('http://localhost:3000/a3');
  26. Promise.all([p1,p2,p3]).then(function(result){
  27. // all 中的参数 [p1,p2,p3] 和 返回的结果一 一对应["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
  28. console.log(result) //["HELLO TOM", "HELLO JERRY", "HELLO SPIKE"]
  29. })
  30. Promise.race([p1,p2,p3]).then(function(result){
  31. // 由于p1执行较快,Promise的then()将获得结果'P1'。p2,p3仍在继续执行,但执行结果将被丢弃。
  32. console.log(result) // "HELLO TOM"
  33. })
  34. </script>

三、 fetch(原生js)

  • Fetch API是新的ajax解决方案,可看作xhr升级版。Fetch会返回Promise
  • fetch不是ajax的进一步封装,而是原生js,没有使用XMLHttpRequest对象
  • fetch(url, options).then()
  1. <script type="text/javascript">
  2. /*
  3. Fetch API 基本用法
  4. fetch(url).then()
  5. 第一个参数请求的路径 Fetch会返回Promise 所以我们可以使用then 拿到请求成功的结果
  6. */
  7. fetch('http://localhost:3000/fdata').then(function(data){
  8. // text()方法属于fetchAPI的一部分,它返回一个Promise实例对象,用于获取后台返回的数据
  9. return data.text();
  10. }).then(function(data){
  11. // 在这个then里面我们能拿到最终的数据
  12. console.log(data);
  13. })
  14. </script>
fetch API 中的 HTTP 请求

fetch(url, options).then()

  • 在 options 参数中(对象)可指定对应的配置参数

    • method(String):请求方法,如POST,GET,DELETE,UPDATE,PATCH和PUT(HTTP协议提供),默认是 GET
    • 当发送POST 和 PUT 请求的时候,需要设置请求头 headers(Object) :请求的内容类型,默认是{} ;和 body(String):传递的数据
  1. <script type="text/javascript">
  2. /*
  3. Fetch API 调用接口传递参数
  4. */
  5. #1.1 GET参数传递 - 传统URL 通过url 的形式传参 ,后台通过req.query.id拿到
  6. fetch('http://localhost:3000/books?id=123', {
  7. # get 请求可以省略不写 默认的是GET
  8. method: 'get'
  9. })
  10. .then(function(data) {
  11. # 它返回一个Promise实例对象,用于获取后台返回的数据
  12. return data.text();
  13. }).then(function(data) {
  14. # 在这个then里面我们能拿到最终的数据
  15. console.log(data)
  16. });
  17. #1.2 GET参数传递 restful形式的URL 通过/ 的形式传递参数 id = 456 。后台通过req.params.id拿到
  18. fetch('http://localhost:3000/books/456', {
  19. # get 请求可以省略不写 默认的是GET
  20. method: 'get'
  21. })
  22. .then(function(data) {
  23. return data.text();
  24. }).then(function(data) {
  25. console.log(data)
  26. });
  27. #2.1 DELETE请求方式参数传递 删除id id=789
  28. fetch('http://localhost:3000/books/789', {
  29. method: 'delete'
  30. })
  31. .then(function(data) {
  32. return data.text();
  33. }).then(function(data) {
  34. console.log(data)
  35. });
  36. #3 POST请求传参
  37. fetch('http://localhost:3000/books', {
  38. method: 'post',
  39. # 3.1 传递数据
  40. body: 'uname=lisi&pwd=123',
  41. # 3.2 设置请求头
  42. headers: {
  43. 'Content-Type': 'application/x-www-form-urlencoded'
  44. }
  45. })
  46. .then(function(data) {
  47. return data.text();
  48. }).then(function(data) {
  49. console.log(data)
  50. });
  51. ## 客户端通过req.body拿到发送的数据
  52. # POST请求传参
  53. fetch('http://localhost:3000/books', {
  54. method: 'post',
  55. body: JSON.stringify({
  56. uname: '张三',
  57. pwd: '456'
  58. }),
  59. headers: {
  60. 'Content-Type': 'application/json'
  61. }
  62. })
  63. .then(function(data) {
  64. return data.text();
  65. }).then(function(data) {
  66. console.log(data)
  67. });
  68. # PUT请求传参 修改id 123 数据
  69. fetch('http://localhost:3000/books/123', {
  70. method: 'put',
  71. body: JSON.stringify({
  72. uname: '张三',
  73. pwd: '789'
  74. }),
  75. headers: {
  76. 'Content-Type': 'application/json'
  77. }
  78. })
  79. .then(function(data) {
  80. return data.text();
  81. }).then(function(data) {
  82. console.log(data)
  83. });
  84. </script>
fetchAPI 中 响应格式
  • 用fetch来获取数据,如果响应正常返回,我们首先看到的是一个response对象,其中包括返回的一堆原始字节。这些字节需要在收到后,通过调用方法将其转换为相应格式的数据,比如JSONBLOB或者TEXT等等

    text():将返回结果处理成字符串类型

    json():返回结果和JSON.parse(responseText)一样
  1. /*Fetch响应结果的数据格式 */
  2. fetch('http://localhost:3000/json').then(function(data){
  3. // return data.json(); // 将获取到的数据 转换成json对象
  4. return data.text(); // // 将获取到的数据 转换成字符串
  5. }).then(function(data){
  6. // console.log(data.uname)
  7. console.log(typeof data)
  8. var obj = JSON.parse(data);
  9. console.log(obj.uname,obj.age,obj.gender)
  10. })

四、axios(第三方js库)

是一个基于promise用于浏览器和node.js的http客户端,专门用于调用接口

  • 支持浏览器和node.js
  • 支持promise
  • 能拦截请求和响应
  • 自动转换JSON数据
  • 能转换请求和响应数据

4.1 axios基础用法

  • get 和 delete 请求传递参数

    • 通过传统的url 以 ? 的形式传递参数 (后台通过req.query.id接收参数值)
    • restful 形式传递参数 (后台通过req.params.id接收参数值)
    • 通过 params 形式传递参数(后台通过req.query.id接收参数值),传递多个参数更方便
  1. # 1. 发送 get 请求
  2. axios.get('http://localhost:3000/adata').then(function(ret){
  3. # 拿到 ret 是一个对象 所有的对象都存在 ret 的 data 属性里面
  4. // 注意data属性是固定的用法,用于获取后台的实际数据
  5. // console.log(ret.data)
  6. console.log(ret)
  7. })
  8. # 2. get 请求传递参数
  9. # 2.1 通过传统的url 以 ? 的形式传递参数
  10. axios.get('http://localhost:3000/axios?id=123').then(function(ret){
  11. console.log(ret.data)
  12. })
  13. # 2.2 restful 形式传递参数
  14. axios.get('http://localhost:3000/axios/123').then(function(ret){
  15. console.log(ret.data)
  16. })
  17. # 2.3 通过params 形式传递参数
  18. axios.get('http://localhost:3000/axios', {
  19. params: {
  20. id: 789
  21. }
  22. }).then(function(ret){
  23. console.log(ret.data)
  24. })
  25. #3 axios delete 请求传参 传参的形式和 get 请求一样
  26. axios.delete('http://localhost:3000/axios', {
  27. params: {
  28. id: 111
  29. }
  30. }).then(function(ret){
  31. console.log(ret.data)
  32. })
  • post 和 put 请求传递参数

    • 通过第二个参数(以JSON对象形式)传递参数,后台以req.body接收
    • 通过 URLSearchParams 传递参数(application/x-www-form-urluncoded) ,后台接收到的是表单形式的数据uname=zhangsan&pwd=111
  1. # 4 axios 的 post 请求
  2. # 4.1 通过选项传递参数
  3. axios.post('http://localhost:3000/axios', {
  4. uname: 'lisi',
  5. pwd: 123
  6. }).then(function(ret){
  7. console.log(ret.data)
  8. })
  9. # 4.2 通过 URLSearchParams传递参数
  10. var params = new URLSearchParams();
  11. params.append('uname', 'zhangsan');
  12. params.append('pwd', '111');
  13. axios.post('http://localhost:3000/axios', params).then(function(ret){
  14. console.log(ret.data)
  15. })
  16. #5 axios put 请求传参和 post 请求一样
  17. axios.put('http://localhost:3000/axios/123', {
  18. uname: 'lisi',
  19. pwd: 123
  20. }).then(function(ret){
  21. console.log(ret.data)
  22. })

4.2 axios 响应结果

主要属性:

  • data:响应的实际数据
  • headers:响应头信息
  • status:响应状态码
  • statusText:响应状态信息

4.3 axios 全局配置

  1. # 配置公共的请求头
  2. axios.defaults.baseURL = 'https://api.example.com';
  3. # 配置超时时间
  4. axios.defaults.timeout = 2500;
  5. # 配置公共的请求头,如果是跨域接口,需要后台配置允许接收这个自定义参数
  6. axios.defaults.headers.common['Authorization'] = AUTH_TOKEN;
  7. # 配置公共的 post 的 Content-Type
  8. axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

4.4 axios 拦截器

  • 请求拦截器

    • 作用是在请求发送前进行一些操作

      • 例如在每个请求体里加上token,统一做了处理如果以后要改也非常容易
  • 响应拦截器
    • 作用是在接收到响应后进行一些操作

      • 例如在服务器返回登录状态失效,需要重新登录的时候,跳转到登录页
  1. # 1. 请求拦截器
  2. axios.interceptors.request.use(function(config) {
  3. console.log(config.url)
  4. # 1.1 任何请求都会经过这一步 在发送请求之前做些什么
  5. config.headers.mytoken = 'nihao';
  6. # 1.2 这里一定要return 否则配置不成功
  7. return config;
  8. }, function(err){
  9. #1.3 对请求错误做点什么
  10. console.log(err)
  11. })
  12. #2. 响应拦截器
  13. axios.interceptors.response.use(function(res) {
  14. #2.1 在接收响应做些什么
  15. var data = res.data;
  16. return data;
  17. }, function(err){
  18. #2.2 对响应错误做点什么
  19. console.log(err)
  20. })

五、async 和 await

  • async作为一个关键字放到函数前面

    • 任何一个async函数都会隐式返回一个promise对象
  • await关键字只能在使用async定义的函数中使用
    • ​ await后面可以直接跟一个 Promise实例对象,对象参数(函数)里面处理异步任务
    • ​ await函数不能单独使用
  • async/await 让异步代码看起来、表现起来更像同步代码
  1. # 1. async 基础用法
  2. # 1.1 async作为一个关键字放到函数前面
  3. async function queryData() {
  4. # 1.2 await关键字只能在使用async定义的函数中使用 await后面可以直接跟一个 Promise实例对象
  5. var ret = await new Promise(function(resolve, reject){
  6. setTimeout(function(){
  7. resolve('nihao')
  8. },1000);
  9. })
  10. // console.log(ret.data)
  11. //返回异步结果
  12. return ret;
  13. }
  14. # 1.3 任何一个async函数都会隐式返回一个promise 我们可以使用then 进行链式编程
  15. queryData().then(function(data){
  16. console.log(data)
  17. })
  18. #2. async函数处理多个异步函数
  19. axios.defaults.baseURL = 'http://localhost:3000';
  20. async function queryData() {
  21. # 2.1 添加await之后 当前的await 返回结果之后才会执行后面的代码
  22. var info = await axios.get('async1');
  23. #2.2 让异步代码看起来、表现起来更像同步代码
  24. var ret = await axios.get('async2?info=' + info.data);
  25. return ret.data;
  26. }
  27. queryData().then(function(data){
  28. console.log(data)
  29. })

六、图书列表案例

6.1 基于接口案例-获取图书列表

  • 导入axios 用来发送ajax
  • 把获取到的数据渲染到页面上
  1. <div id="app">
  2. <div class="grid">
  3. <table>
  4. <thead>
  5. <tr>
  6. <th>编号</th>
  7. <th>名称</th>
  8. <th>时间</th>
  9. <th>操作</th>
  10. </tr>
  11. </thead>
  12. <tbody>
  13. <!-- 5. 把books 中的数据渲染到页面上 -->
  14. <tr :key='item.id' v-for='item in books'>
  15. <td>{{item.id}}</td>
  16. <td>{{item.name}}</td>
  17. <td>{{item.date }}</td>
  18. <td>
  19. <a href="">修改</a>
  20. <span>|</span>
  21. <a href="">删除</a>
  22. </td>
  23. </tr>
  24. </tbody>
  25. </table>
  26. </div>
  27. </div>
  28. <script type="text/javascript" src="js/vue.js"></script>
  29. 1. 导入axios
  30. <script type="text/javascript" src="js/axios.js"></script>
  31. <script type="text/javascript">
  32. /*
  33. 图书管理-添加图书
  34. */
  35. # 2 配置公共的url地址 简化后面的调用方式
  36. axios.defaults.baseURL = 'http://localhost:3000/';
  37. axios.interceptors.response.use(function(res) {
  38. return res.data;
  39. }, function(error) {
  40. console.log(error)
  41. });
  42. var vm = new Vue({
  43. el: '#app',
  44. data: {
  45. flag: false,
  46. submitFlag: false,
  47. id: '',
  48. name: '',
  49. books: []
  50. },
  51. methods: {
  52. # 3 定义一个方法 用来发送 ajax
  53. # 3.1 使用 async 让异步的代码 以同步的形式书写
  54. queryData: async function() {
  55. // 调用后台接口获取图书列表数据
  56. // var ret = await axios.get('books');
  57. // this.books = ret.data;
  58. # 3.2 发送ajax请求 把拿到的数据放在books 里面
  59. this.books = await axios.get('books');
  60. }
  61. },
  62. mounted: function() {
  63. # 4 mounted 里面 DOM已经加载完毕 在这里调用函数
  64. this.queryData();
  65. }
  66. });
  67. </script>

6.2 添加图书

  • 获取用户输入的数据 发送到后台
  • 渲染最新的数据到页面上
  1. methods: {
  2. handle: async function(){
  3. if(this.flag) {
  4. // 编辑图书
  5. // 就是根据当前的ID去更新数组中对应的数据
  6. this.books.some((item) => {
  7. if(item.id == this.id) {
  8. item.name = this.name;
  9. // 完成更新操作之后,需要终止循环
  10. return true;
  11. }
  12. });
  13. this.flag = false;
  14. }else{
  15. # 1.1 在前面封装好的 handle 方法中 发送ajax请求
  16. # 1.2 使用async 和 await 简化操作 需要在 function 前面添加 async
  17. var ret = await axios.post('books', {
  18. name: this.name
  19. })
  20. # 1.3 根据后台返回的状态码判断是否加载数据
  21. if(ret.status == 200) {
  22. # 1.4 调用 queryData 这个方法 渲染最新的数据
  23. this.queryData();
  24. }
  25. }
  26. // 清空表单
  27. this.id = '';
  28. this.name = '';
  29. },
  30. }

6.3 验证图书名称是否存在

  • 添加图书之前发送请求验证图示是否已经存在
  • 如果不存在 往后台里面添加图书名称
    • 图书存在与否只需要修改submitFlag的值即可
  1. watch: {
  2. name: async function(val) {
  3. // 验证图书名称是否已经存在
  4. // var flag = this.books.some(function(item){
  5. // return item.name == val;
  6. // });
  7. var ret = await axios.get('/books/book/' + this.name);
  8. if(ret.status == 1) {
  9. // 图书名称存在
  10. this.submitFlag = true;
  11. }else{
  12. // 图书名称不存在
  13. this.submitFlag = false;
  14. }
  15. }
  16. },

6.4 编辑图书

  • 根据当前书的id 查询需要编辑的书籍
  • 需要根据状态位判断是添加还是编辑
  1. methods: {
  2. handle: async function(){
  3. if(this.flag) {
  4. #4.3 编辑图书 把用户输入的信息提交到后台
  5. var ret = await axios.put('books/' + this.id, {
  6. name: this.name
  7. });
  8. if(ret.status == 200){
  9. #4.4 完成添加后 重新加载列表数据
  10. this.queryData();
  11. }
  12. this.flag = false;
  13. }else{
  14. // 添加图书
  15. var ret = await axios.post('books', {
  16. name: this.name
  17. })
  18. if(ret.status == 200) {
  19. // 重新加载列表数据
  20. this.queryData();
  21. }
  22. }
  23. // 清空表单
  24. this.id = '';
  25. this.name = '';
  26. },
  27. toEdit: async function(id){
  28. #4.1 flag状态位用于区分编辑和添加操作
  29. this.flag = true;
  30. #4.2 根据id查询出对应的图书信息 页面中可以加载出来最新的信息
  31. # 调用接口发送ajax 请求
  32. var ret = await axios.get('books/' + id);
  33. this.id = ret.id;
  34. this.name = ret.name;
  35. },

6.5 删除图书

  • 把需要删除的id书籍 通过参数的形式传递到后台
  1. deleteBook: async function(id){
  2. // 删除图书
  3. var ret = await axios.delete('books/' + id);
  4. if(ret.status == 200) {
  5. // 重新加载列表数据
  6. this.queryData();
  7. }
  8. }

Vue之前后端交互的更多相关文章

  1. Vue - 与后端交互

    零:与后端交互 - ajax 版本1 - 出现了跨域问题 前端:index.html <!DOCTYPE html> <html lang="en"> &l ...

  2. 三、vue前后端交互(轻松入门vue)

    轻松入门vue系列 Vue前后端交互 六.Vue前后端交互 1. 前后端交互模式 2. Promise的相关概念和用法 Promise基本用法 then参数中的函数返回值 基于Promise处理多个A ...

  3. Flask + vue 前后端分离的 二手书App

    一个Flask + vue 前后端分离的 二手书App 效果展示: https://blog.csdn.net/qq_42239520/article/details/88534955 所用技术清单 ...

  4. Vue-CLI项目-axios模块前后端交互(类似ajax提交)

    08.31自我总结 Vue-CLI项目-axios前后端交互 一.模块的安装 npm install axios --save #--save可以不用写 二.配置main.js import axio ...

  5. vue前后端分离

    axios前后端交互 安装 一定要安装到`项目目录下 cnpm install axios 配置 在main.js中配置 //配置axios import axios from 'axios' Vue ...

  6. 谷粒商城为什么要选择后天管理用vue前后端分离,而商城页面选择Thymeleaf类?

    1.最初使用jsp开发web项目 还记得刚学习Java的时候,自己开发一个web项目,那时候前后端分离还不流行,为了在页面中显示动态数据,最终的形式也就是以动态网页响应用户,Java一种技术jsp,J ...

  7. 窗口 - dialog - 与后端交互

    与后端交互,一般需要提交表单数据,所以,这次渲染得dialog其实是一个<form> <form id="loginForm"> <table ali ...

  8. Node之简单的前后端交互

    node是前端必学的一门技能,我们都知道node是用的js做后端,在学习node之前我们有必要明白node是如何实现前后端交互的. 这里写了一个简单的通过原生ajax与node实现的一个交互,刚刚学n ...

  9. Django之META与前后端交互

    Django之META与前后端交互 1 提交表单之GET 前端提交数据与发送 1)提交表单数据 2)提交JSON数据 后端的数据接收与响应 1)接收GET请求数据 2)接收POST请求数据 3)响应请 ...

随机推荐

  1. python 闭包函数与装饰器

    1.什么是闭包函数 (1):什么是闭包函数: #内部函数包含对外部作用域而非全局作用域的引用, 简而言之, 闭包的特点就是内部函数引用了外部函数中的变量. 在Python中,支持将函数当做对象使用,也 ...

  2. 963. Minimum Area Rectangle II

    Given a set of points in the xy-plane, determine the minimum area of any rectangle formed from these ...

  3. Java基础(面试复习整理)

    基础知识和语法 Java语言初识 计算机语言发展 机器语言.汇编.C.C++.Java Java的诞生与发展 1995 JavaSE JavaME Android JavaEE 2006(大数据) H ...

  4. SpringCloud(六)Bus消息总线

    Bus 消息总线 概述 分布式自动刷新配置功能 Spring Cloud Bus 配合 Spring Cloud Config使用可以实现配置的动态刷新 Bus支持两种消息代理:RabbitMQ和Ka ...

  5. 【MySQL】Mysql避免索引失效的情况有哪些

    1.使用多列作为索引,则需要遵循最左前缀匹配原则(查询从索引的最左前列开始并且不跳过索引中的列) 2.不再索引列上做任何操作,例如(计算,函数,(自动 or 手动的类型转换)),会导致索引失效而转向全 ...

  6. SSDT表函数Hook原理

    其实 SSDT Hook 的原理是很简单的,我们可以知道在 SSDT 这个数组中呢,保存了系统服务的地址,比如对于 Ring0 下的 NtQuerySystemInformation 这个系统服务的地 ...

  7. IIS6目录解析漏洞的实验

    ​​​​​​​​​​Windows 打开IIS管理器的方式 这个是网站IIS网站目录 右击默认网站中的属性,可以查看网站的属性,比如网站根目录,或者是端口 这个是网站的目录C:\www,有三个文件分别 ...

  8. C# 通过DataSet 获取SQL 存储过程返回的多个结果集(tables)

    测试数据:Northwind 链接地址: https://files.cnblogs.com/files/louiszh/NorthWind.zip 首先创建一个测试存储过程: IF EXISTS ( ...

  9. Redis 集群伸缩原理

    Redis 节点分别维护自己负责的槽和对应的数据.伸缩原理:Redis 槽和对应数据在不同节点之间移动 环境:CentOS7 搭建 Redis 集群 一.集群扩容 1. 手动扩容 (1) 准备节点 9 ...

  10. DLL注入技术(输入法注入)

    输入法注入原理 IME输入法实际就是一个dll文件(后缀为ime),此dll文件需要导出必要的接口供系统加载输入法时调用.我们可以在此ime文件的DllMain函数的入口通过调用LoadLibrary ...