在某项目中,需要使用python flask做后端功能开发,web提供功能入口。

此时需要使用Ajax通信。

由于以前从未接触过网络传输,记录了一些基础知识。

资料参考《HTML5+CSS3+JavaScript从入门到精通》第19章。

Ajax

Ajax(Asynchronous Javascript And XML, 异步JavaScript和XML)又称Web数据交互方式,是利用JS脚本和XML数据实现客户端和服务器端之间快捷通信的技方法,包括:

  • 基于标准化的HTML和CSS
  • 通过DOM实现动态显示和交互
  • 通过XML或JSON来进行数据交换和处理
  • 使用XMLHttpRequest实现异步数据交换
  • 使用JS脚本控制数据交换的前后行为

基础

XMLHttpRequest是主要对象,其主要方法有:

  • abort() 取消当前请求
  • open() 创建新的请求
  • setRequestHeader() 单独制定请求的某个HTTP头
  • send() 发送请求并接收回应
  • getAllResponseHeaders() 获取响应的所有HTTP头
  • getRespnseHeader() 获取特定的响应HTTP头

    常见请求类型有:GET和POST

    主要属性有:
  • readyState 当前请求的状态
  • onreadystatechange 当readyState 改变时的时间处理句柄(回调函数)
  • responseBody 响应正文
  • responseStream 以ADO Stream对象形式返回的响应信息
  • responseText 将响应信息作为字符串返回
  • responseXML 将响应信息格式化为XML document对象并返回
  • status 返回当前请求的http状态码
  • statusText 返回当前请求的响应行状态

    一次通信的范式是:

    1、实例化一个XMLHttpRequest对象

    2、调用XMLHttpRequest对象的open()方法打开服务器端的某个URL地址

    3、注册onreadystatechange事件处理函数,准备接受响应数据,并进行处理

    4、调用XMLHttpRequest对象的send()方法发送请求。

创建XMLHttpRequest对象

  1. function createXMLHTTPObject()
  2. {
  3. var XMLhttpFactories = [//兼容不同浏览器和版本的创建函数数组
  4. function() {return new XMLHttpRequest()},
  5. function() {return new ActiveXObject("Msxml2.XMLHTTP")},
  6. function() {return new ActiveXObject("Msxml3.XMLHTTP")},
  7. function() {return new ActiveXObject("Microsoft.XMLHTTP")},
  8. ];
  9. var xmlhttp = false;
  10. for (var i = 0; i < XMLhttpFactories.length; i++)
  11. {
  12. try
  13. {
  14. xmlhttp = XMLhttpFactories[i]();
  15. break; //如果成功,则终止循环
  16. }
  17. catch (e)
  18. {
  19. continue; //如果异常,则继续使用下一个创建函数
  20. }
  21. }
  22. return xmlhttp;
  23. }

打开服务器端的某个URL地址

本项目是通过flask设置了URL地址,比较轻便

XMLHttpRequest对象open的时候,只需要

  1. xmlhttp = createXMLHTTPObject();
  2. request_type = "GET"; //常见的有GET和POST
  3. request_url = "http://127.0.0.1:5000/test/"; //flask创建的一个本地服务器
  4. asynchronous_type = false; //True为异步,false为同步
  5. xmlhttp.open(request_type, request_url, asynchronous_type);

个人理解,GET模式只需发送地址,在send()时没有其他的参数,而POST模式在send()时还需要打包其他的参数

注册onreadystatechange事件处理函数

在写事件处理函数前,需要对跟踪状态有一定了解。

跟踪状态

当一个请求发送后,XMLHttpRequest对象通过readyState属性实时跟踪异步交互状态,当该属性变化时,将处罚readystatechange事件,调用绑定该事件的回调函数。

readyState有5种状态:

0. 未初始化,对象已建立,但未调用open()方法

  1. 初始化,对象已建立,但未调用send()方法
  2. 已发送,表示send()方法已调用,但当前状态未知及HTTP头未知
  3. 数据传送中,已接收部分数据,但是还没有完全好。
  4. 完成,可以通过responseBody和responseText获取完整的响应数据。

    一般,需要等xmlhttp.readyState4时,才应当进行操作。

    http状态码(xmlhttp.status)也经常参与状态跟踪,xmlhttp.status200为成功,其余为各种错误。

事件处理函数一个简单例子

  1. xmlhttp.onreadystatechange=function()
  2. {
  3. if (xmlhttp.readyState==4 && xmlhttp.status==0)
  4. // 请求已返回,但http状态为0,表示未连接到服务器
  5. {
  6. show_message('后台服务未开启', 2000);
  7. }
  8. if (xmlhttp.readyState==4 && xmlhttp.status==200)
  9. // 请求已返回,且服务器返回状态为OK
  10. {
  11. //DO SOMETHING
  12. }
  13. }

XMLHttpRequest对象发送请求

GET请求

  1. xmlhttp = createXMLHTTPObject();
  2. xmlhttp.open("GET", "http://127.0.0.1:5000/test/", flase);
  3. xmlhttp.send(null);
  4. result = xmlhttp.responseText;

POST请求

POST请求需要send一份数据,本项目用的是JSON,相对比较简单

  1. xmlhttp = createXMLHTTPObject();
  2. xmlhttp.open("POST", "http://127.0.0.1:5000/test/", flase);
  3. // 如果传递json格式的数据,需要设置发送数据类型为json
  4. _xmlhttp.setRequestHeader("Content-Type", "application/json; charset=utf-8");
  5. var request_data = {};
  6. request_data["tmp_dir"] = decrypt_tmp_dir; // 变量1
  7. request_data["type"] = op_mode; // 变量2
  8. xmlhttp.send(JSON.stringify(request_data)); // json格式
  9. result = xmlhttp.responseText;

除了json外,还有串行(application/x-www-form-urlencoded),xml (text/xml),

XMLHttpRequest对象接收响应

响应格式有

  • respeonseBody 以unsigned byte格式返回
  • responseStream 以ADO Stream对象返回
  • responseText 以字符串格式返回,json可以直接以该模式得到,再通过eval()得到对象。
  • responseXML 以XML文档格式返回

    对于本项目来说,直接使用 responseText即可。
  1. rst = xmlhttp.responseText;

前端后端通信初步尝试(javascript - flask)的更多相关文章

  1. Springboot第三篇:与前端fetch通信(关于前端传输json数据上传文件等等前后端的处理)

    关于前端接口传递的方法,推荐按以下使用: 若要在服务器上创建资源,推荐使用POST方法 若要检索某个资源,推荐使用GET方法 若要更新资源,推荐使用PUT方法 若要删除某个资源,推荐使用DELETE方 ...

  2. 前端笔记知识点整合之JavaScript(三)关于条件判断语句、循环语句那点事

      一.条件分支语句 条件分支语句,也叫作条件判断语句,就是根据某种条件执行某些语句,不执行某些语句. JS中有三种语法是可以表示条件分支的 1.1 if……else…… 条件分支的主力语法,这个主力 ...

  3. Springboot第二篇:与前端fetch通信(附springboot解决跨域方法)

    说到与前端通信,明白人都知道这章肯定会写两部分的东西啦. 关于后台 ①首先回顾前文,上一章环境搭建如图: ②我们在maven.example.controller下添加一个文件,并附上如图代码: ③: ...

  4. 从前端到全栈:JavaScript逆袭之路

    JavaScript如何做到上天入地无所不能?JavaScript真的能一统江湖吗? 背景 近年来,前端技术日新月异,前端已经不仅仅是网页,更多的开始由狭义向广义发展. 先后涌现出了具备后端能力的no ...

  5. 15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码)

    15分钟带你了解前端工程师必知的javascript设计模式(附详细思维导图和源码) 前言 设计模式是一个程序员进阶高级的必备技巧,也是评判一个工程师工作经验和能力的试金石.设计模式是程序员多年工作经 ...

  6. 前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型

    前端开发:面向对象与javascript中的面向对象实现(二)构造函数与原型 前言(题外话): 有人说拖延症是一个绝症,哎呀治不好了.先不说这是一个每个人都多多少少会有的,也不管它究竟对生活有多么大的 ...

  7. 前端开发:面向对象与javascript中的面向对象实现(一)

    前端开发:面向对象与javascript中的面向对象实现(一) 前言: 人生在世,这找不到对象是万万不行的.咱们生活中,找不到对象要挨骂,代码里也一样.朋友问我说:“嘿,在干嘛呢......”,我:“ ...

  8. Python爬虫学习:二、爬虫的初步尝试

    我使用的编辑器是IDLE,版本为Python2.7.11,Windows平台. 本文是博主原创随笔,转载时请注明出处Maple2cat|Python爬虫学习:二.爬虫的初步尝试 1.尝试抓取指定网页 ...

  9. 前端回顾:2016年 JavaScript 之星

    JavasScript社区在创新的道路上开足了马力,曾经流行过的也许一个月之后就过时了.2016已经结束了.你可能会想你是否错过一些重要的东西?不用担心,让我们来回顾2016年前端有哪些主流.通过比较 ...

随机推荐

  1. 【编程思想】【设计模式】【行为模式Behavioral】状态模式State

    Python版 https://github.com/faif/python-patterns/blob/master/behavioral/state.py #!/usr/bin/env pytho ...

  2. vue 键盘事件keyup/keydoen

    使用: <!DOCTYPE html> <html> <head> <title></title> <meta charset=&qu ...

  3. MySQL数据库行转列

    一.数据源如下所示 二.对应SQL语句如下所示 -- 行转列 SELECT t1.`产品名称`, SUM(CASE t1.`日期` WHEN '2019-11-11' THEN t1.`数量` ELS ...

  4. [BUUCTF]REVERSE——[BJDCTF 2nd]guessgame

    [BJDCTF 2nd]guessgame 附件 步骤: 例行查壳儿,64位程序,没有壳儿 64位ida载入,习惯性的检索程序里的字符串,看到了一串类似flag的字符串,拿去提交,成功 BJD{S1m ...

  5. Java中List排序的3种方法

    在某些特殊的场景下,我们需要在 Java 程序中对 List 集合进行排序操作.比如从第三方接口中获取所有用户的列表,但列表默认是以用户编号从小到大进行排序的,而我们的系统需要按照用户的年龄从大到小进 ...

  6. SQL 注入基础

    SQL注入 SQL注入是服务器端未严格校验客户端发送的数据,而导致服务端SQL语句被恶意修改并成功执行的行为. 本质:把用户输入的数据当作代码执行.任何和数据库产生交互的地方便有可能存在注入. SQL ...

  7. Linux运维常见问题

    一.启动/重启/停止命令 1.jenkins的启动.停止和重启命令 启动:service jenkins start 或者systemctl start jenkins 状态:service jenk ...

  8. java 多线程 读写互斥锁ReentrantReadWriteLock:读读不互斥,读写互斥,写写互斥

    ReentrantReadWriteLock: 类ReentrantLock具有相互互斥的排他效果,也就是说,同一时间,只有一个线程执行lock()方法后面的任务.这样做虽然可以解决问题,但是效率非常 ...

  9. 什么是SEO配置

    SEO是什么 搜索引擎优化,又称为SEO,即Search Engine Optimization,它是一种通过分析搜索引擎的排名规律,了解各种搜索引擎怎样进行搜索.怎样抓取互联网页面.怎样确定特定关键 ...

  10. LocalDateTime与Date相互转换

    LocalDateTime 转 Date LocalDateTime localDateTime=LocalDateTime.now() Date date = Date.from(localDate ...