第11章 Web的概念与原理
11.1 Web 概念与开发技术
11.1.1 Web 的概念
- Web
- 是万维网(World Wide Web)的简称
- 是一个通过互联网(Internet)进行访问的由大量相互链接的超文件组成的系统
- 是一个客户机/服务器模式的分布式系统
- 客户端:浏览器、移动APP
- 浏览器/服务器
- 服务器端
- Web核心技术
- HTML:用于定义超文本文档的结构和格式
- URI:用于唯一的定位Web中的每个资源,包括文档、图片、视频、声音等等
-
HTTP:用于规定客户端和服务器之间的交互、通信标准
-
Web 2.0
- Web的应用趋于交互化、社交化
- 以互动、分享和关系为核心
- 典型的Web 2.0 应用包括博客、微博客、短视频、百科站点、社交网络、即时通讯等
- 影响
- 巨大的业务数据
- 深深改变了人们的生活方式
- 巨大的商业价值
- 技术特点
- Web 2.0本质上并有引入革命性的技术,其核心依旧是HTML、URI和HTTP协议
- 服务器端应用程序起着更为核心的作用,Web页面不再是静态的
- 要求强大的数据库系统和业务逻辑系统的支持,与传统软件的应用服务器越来越相似
-
Web 3.0
- 超高的带宽
- 人工智能技术的应用
- 云计算
- 语义网技术
- 虚拟现实/增强现实
-
Web的工作原理
11.1.2 Web 页面的访问过程
- 静态网页的运行过程
- 动态网页的运行过程
11.1.3 Web 开发技术栈
11.2 统一资源标识符
- URI
- 全称是通一资源标识符(Uniform Resource Identifie),用来唯一地标识一个资源
- 不要求其所标识的资源是网络资源
- URL
- 统一资源定位符(Uniform Resource Locator,URL)
- URN
- 统一资源名称(Uniform Resource Name,URN)
- 利用命名空间来确保URN的合局唯一性,其形式为
urn:<NID>:<NSS> - 例:
urn:isbn:0451450523,表示一本书的编号
11.2.1 统一资源定位符
- URL的标准格式
- 端口号可以省略,默认取值为80;文件名、查询、片段ID都是可选项
1 | |
- 例:
1 | |
11.2.2 URL 的解析
urllib.parse
urllib.parse模块提供了解析或构造URL的功能urlparseurlunparseurljoin
1 2 3 4 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
1 | |
urlunparse的功能与urlparse相反,是将各个组成部分组装为一个合法的URL
1 2 | |
1 2 3 4 5 6 | |
1 | |
1 | |
urljoin的作用是将原URL中的服务器根路径与一个新的路径合并为一个新的URL
1 2 | |
1 | |
1 | |
1 | |
11.3 超文本标记语言
11.3.1 HTML的结构
-
HTML示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Python编程</title> </head> <body> <div class="continer"> <div class="box"> <h1>课后作业提交</h1> <form action="/" method="post" accept-charset="utf-8"> <div> <span>学号:</span><input type="text" name="usertag" /> <span></span> <span>密码:</span><input type="password" name="password" /> </div> <br> <div> <textarea name="code" id="codebox" rows="10" wrap="off"> 代码拷到这里! </textarea> </div> <br> <div> <input type="submit" value="提交代码" /> </div> </form> </div> <br> </div> </body> </html> -
常用 HTML 标签
| 标签 | 功能 | 常用子标签 |
|---|---|---|
html |
HTML 文档的最外层标签 | head, body |
head |
HTML 文档的头部 | title, link, script, style, meta |
body |
HTML 文档的主体 | head 之外的大多数标签 |
title |
HTML 文档的标题 | 无 |
talbe |
表格 | tr, td |
tr |
表格的一行 | td |
td |
表格的一个单元格 | 大多数能放入 body 的标签 |
form |
表单 | input、select 等输入控件,table, div |
textarea |
文本域 | —— |
div |
块元素,用于组织文档内容 | 大多数能放入 body的标签 |
span |
行内块元素 | a |
ul |
无序列表 | li |
ol |
有序列表 | li |
li |
列表元素 | a, span |
a |
超链接 | —— |
img |
图片 | —— |
br |
换行 | —— |
h1-h6 |
六个级别的标题 | a,span |
link |
用于链接外部样式表 | —— |
style |
内部样式表 | —— |
script |
JavaScript 脚本 | —— |
audio |
音频内容 | —— |
video |
视频内容 | —— |
canvas |
图形容器 | —— |
- 页面显示如下
11.3.2 HTML 文档的修饰与控制
- HTML样式控制
- 层叠样式表(Cascading Style Sheets,CSS)
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | |
页面显示为:
- HTML行为控制
- JavaScript
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 | |
页面显示为:
11.4 超文本传输协议
- HTTP
- Web服务器与客户端之间的传输HTML文档的协议
- 处于OSI/ISO参考模型的最顶层应用层,在TCP/IP参考模型中位于传输层之上,通常基于TCP协议实现
- HTTP协议的特点
- 无连接性:一般情况下,为了节省传输时间降低网络开销,每次TCP连接只处理一个请求/响应过程,客户端接收到服务器的响应好TCP连接就被断开
- 无状态性:无状态是指协议没有对事务处理的记忆能力,服务器需要使用其他的手段来判断不同请求是否来自相同的客户端
- 媒体内容独立性:HTTP协议并不要求传输内容一定是HTML文档,实际上任何数据都可以通过HTTP协议传输,传输内容的类型和格式由MIME类型来指定
11.4.1 HTTP 请求
HTTP请求的格式

HTTP请求格式
请求方法
| 方法 | 描述 |
|---|---|
| GET | 请求服务器中的资源,请求的查询参数包含在URL之中 |
| HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取请求头中的信息,通常常并不单独使用 |
| POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件),数据包含在请求正文之中。POST 请求往往意味着资源的创建或修改 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容 |
| DELETE | 请求服务器删除指定的资源 |
| PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 |
| CONNECT | 将服务器作为代理来访问其他Web资源 |
| OPTIONS | 查看服务器的性能 |
| TRACE | 回溯服务器收到的请求,主要用于测试或诊断 |
协议版本
- HTTP 1.0
- 支持GET、POST和HEAD三种方法;传输内容不再仅限于HTML文档,可以利用Content-Type支持多种格式;支持浏览器缓存;
- HTTP 1.1
- 引入了持久连接(Persistent Connection),即一次TCP连接可以被多个HTTP请求重复使用;新增了多种请求方法类型;
- HTTP 2.0
- 增加了双工模式,即客户端同时发出多个请求的同时,服务器端也可以同时处理多个请求;增加了服务器推送功能。
HTTP请求头
| Header | 解释 | 示例 |
|---|---|---|
| Accept | 客户端能够接收的内容类型 | Accept: text/plain, text/html |
| Accept-Charset | 客户端能够接受的字符编码集 | Accept-Charset: utf-8 |
| Accept-Encoding | 客户端能够支持的内容压缩编码类型 | Accept-Encoding: compress, gzip |
| Accept-Language | 客户端能够接受的语言 | Accept-Language: en,zh |
| Cache-Control | 指定请求和响应遵循的缓存机制 | Cache-Control: no-cache |
| Connection | 是否允许持久连接(HTTP 1.1默认允许) | Connection: close |
| Cookie | 客户端发出请求时,会把保存在相同请求域名下的 所有cookie值一起发送给web服务器 |
Cookie: user=name; type=vip; |
| Content-Length | 请求正文的长度 | Content-Length: 520 |
| Date | 请求发送的日期和时间 | Date: Tue, 2 JUN 2020 12:15:36 GMT |
| Host | 指定请求的服务器的域名和端口号 | Host: www.baidu.com |
| Referer | 上次请求的URL | Referer: https://www.baidu.com/s?wd=http&ie=utf-8 |
| User-Agent | 关于客户端的一些信息 | User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) |
请求正文
- GET请求的信息包含在URL之中,因此不包含请求正文
- POST请求的信息则是包含在正文之中的
示例
1 2 3 4 5 6 7 8 9 | |
11.4.2 HTTP 响应
HTTP响应格式
状态码
- HTTP响应的状态码是以1、2、3、4或5开头的三位整数
- 1XX:提示信息,表示服务器收到请求,需要客户端继续执行操作
- 2XX:响应成功,请求被成功接收并处理
- 3XX:重定向
- 4XX:客户端错误,请求包含错误或无法完成请求
-
5XX:服务器错误
-
常见的状态码
| 状态码 | 描述 | 含义 |
|---|---|---|
| 200 | OK | 响应成功 |
| 400 | Bad Request | HTTP请求格式不正确 |
| 404 | Not Found | 文件不存在 |
| 405 | Method Not Allowed | 服务器不支持请求方法 |
| 500 | Internal Server Error | 服务器内部错误 |
响应头
- 常用的响应头信息
| Header | 解释 | 示例 |
|---|---|---|
| Allow | 服务器允许的请求方法 | Allow: GET, POST, HEAD |
| Content-Encoding | 响应正文的压缩编码类型 | Content-Encoding: gzip |
| Content-Language | 响应正文的语言 | Content-Language: en,zh |
| Content-Length | 响应正文的长度 | Content-Length: 263 |
| Content-Type | 响应正文内容的MIME类型 | Content-Type: text/html; charset=utf-8 |
| Date | 响应时间 | Date: Tue, 2 JUN 2020 12:15:36 GMT |
| Expires | 响应过期不再缓存的时间 | Expires: WED, 3 JUN 2020 12:15:36 GMT |
| Last-Modified | 请求资源的最后修改时间 | Last-Modified: Tue, 2 JUN 2020 12:15:36 GMT |
| Location | 重定向的URL | Location: https://www.baidu.com |
| refresh | 重定向后的页刷新时间 | Refresh: 5; url=https://www.baidu.com/s?wd=http&ie=utf-8 |
| Server | Web服务器软件名 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux) |
| Set-Cookie | 设置 Cookie | Set-Cookie: UserID=admin; Max-Age=3600; Version=1 |
MIME协议
- MIME
- Multipurpose Internet Mail Extension
- HTTP请求和响应正文的MIME类型用请求头或响应头部的Content-Type来指定
-
MIME协议不是一个独立的协议,它可以用于各种应用层协议之上用于规范网络传输数据的格式
- 它与SMTP协议相结合,使得Email能够发送各种格式的文件
-
常用MIME类型
| 扩展名 | MIME类型 |
|---|---|
| avi | video/x-msvideo |
| bin, exe | application/octet-stream |
| bmp | image/bmp |
| css | text/css |
| gif | image/gif |
| gz | application/x-gzip |
| html, htm, c, txt | text/html |
| jpeg, jpg | image/jpeg |
| js | application/x-javascript |
| mp3 | audio/mpeg |
| mpeg | video/mpeg |
| application/pdf | |
| tar | application/x-tar |
| txt, c | text/plain |
| wav | audio/x-wav |
| zip | application/zip |
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
11.4.3 HTTP 协议解析
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 | |
11.5 Web 服务器的工作原理
11.5.1 基于套接字的 Web 服务器端
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | |
11.5.2 简单Web服务器
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 | |
11.6 Web 客户端的工作原理
- 注意:本小节代码的运行首先需要运行一个Web服务器
11.6.1 基于套接字的 Web 客户端
- GET请求
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | |
1 2 3 | |
HTTP响应: --------------------
HTTP/1.1 200 OK
Content-Length: 1675
Content-Type: text/html; charset=utf-8
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
- POST请求
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 | |
11.6.2 基于 http.client 的 Web 客户端
- GET请求
1 | |
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
- POST请求
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
11.6.3 urllib.request与requests
GET请求
urllib.request
1 2 3 4 5 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
requestspip install requests
1 2 3 4 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
POST请求
urllib.request
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
requests
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | |
11.7 WebSocket 协议 *
- HTTP协议的缺点
- 服务器不能主动向客户端发送消息
11.7.1 WebSocket 的工作过程
- 握手
- 基于HTTP协议
- 协议升级
- 通信
- 双向通信
11.7.2 握手
- WebSocket 握手请求
- 重要的几个请求头
Connection: 取值必须为Upgrade表示客户端希望升级协议Upgrade: 取值必须为websocket表示客户端希望升级的协议为 WebSocket 协议Sec-Websocket-Key: 客户端随机生成的一串字符Sec-WebSocket-Version: WebSocket 协议版本,RFC6455 规定该值必须为 13
- 示例
1 2 3 4 5 | |
- WebSocket 握手响应
- 响应代码为 101,表示服务器同意客户端协议转换请求
- 握手响应中同样包含了特殊的响应头 和取值,主要有三个
Connection、Upgrade和Sec-WebSocket-AcceptConnection和Upgrade与请求头一致
Sec-WebSocket-Accept- 将请求中
Sec-Websocket-Key的值与“Magic String”拼接- 258EAFA5-E914-47DA-95CA-C5AB0DC85B11
- SHA-1 编码
- Base64 编码
- 示例
1 2 3 4 | |
- WebSocket 握手的请求解析与响应构造
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | |
11.7.3 WebSocket 协议解析
- 协议标识为ws
- 例: ws://www.test.com/websocket
- WebSocket 协议中数据传输的单位为帧(Frame),每帧能够携带的最大数据量为 264 − 1 字节
11.7.4 WebSocket 服务器
- 服务器端
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | |
- 基于网页的客户端
1 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 | |
本页面的全部内容在 生信资料 bio.0594codes.cn 和 莆田青少年编程俱乐部 0594codes.cn 协议之条款下提供,附加条款亦可能应用