开发者学堂课程【Python Web 开发基础:B/S 开发和 HTTP 协议】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/554/detail/7636
B/S 开发和 HTTP 协议
内容介绍:
一、CS
二、BS 编程
三、HTTP 协议
四、HTTP 消息
一、CS
CS 即客户端、服务器编程。
客户端、服务端之间需要使用 Socket,约定协议、版本(往往使用的协议是 TCP 或者 UDP),指定地址和端口,就可以进行通信了。
客户端、服务端传输数据,数据可以有一定的格式,双方必须先约定好,做好约定协议。
二、BS编程
1.BS 编程,即 Browser、Server 开发。
2.Browser 浏览器,一种特殊的客户端,有界面的、可操作的浏览器,支持 HTTP(s) 协议,能够通过 URL 向服务端发起请求,等待服务端返回 HTML 等数据,并在浏览器内可视化展示的程序。
3.Server,支持 HTTP(s) 协议,能够接受众多客户端发起的 HTTP 协议请求,经过渲染处理,将 HTML 等数据返回给浏览器,呈现出来。
4.浏览器端不放任何网页。
5.本质上来说,BS 是一种特殊的 CS,即客户端必须是一种支持 HTTP 协议且能解析并渲染 HTML 的软件,服务端必须是能够接收多客户端 HTTP 访问的服务器软件。
6.HTTP 协议底层基于 TCP 协议实现。
7.BS 开发分为两端开发
客户端开发,或称前端开发。浏览器中呈现的东西就是前端开发。HTML、cSS、JavaScript 等
服务端开发,Python 有 WSGI、Django、Flask、Tornado 等
三、HTTP 协议
(一)安装 httpd
链接为:
#yum install httpd
安装上面的 httpd,功能多,可以使用 httpd 服务,进行学习和观察 http 协议。
(二)协议
Http 协议是无状态协议,这是 http 协议的一个天生缺陷,即漏洞。导致现在的 http 协议技术发展起来,出现各种各样的解决办法。
同一个客户端的两次请求之间没有任何关系,从服务器端角度来说,两次请求发送过来,它并不知道这两个请求来自同一个客户端,不同浏览器发送的请求,它也不知道来自不同浏览器。
因 http 协议开发时的网络环境不好,性能不好,未考虑到之后 http 协议会发展成为互联网中唯一的应用协议,也未预见到互联网服务器端会产生一个动态网络技术。
解决办法:给它发送一些特殊的数据,例如,cookie。
(三)cookie
打开 Bing 浏览器,按 f12 就可以打开开发者工具,可以看到很多文件,及 http 请求过程。
每个键值都有对应的信息。
浏览器发起每一请求时,都会把 cookie 信息包含在 http 的请求中发给服务器端。服务器端就会收到一个 cookie,并对 cookie 中的数据进行处理。
cookie 可以解决无状态问题,有很大的安全问题,必须用强加密算法来加密,使它无法更改,或无法看见。
是一种客户端、服务器端双向传递数据的技术。
服务端可以通过判断这些信息,来确定这次请求是否和之前的请求有关联。一般来说 cookie 信息是在服务器端生成,返回给客户端的。
第一回发送的请求没有 cookie,及 cookie 中没有数据,服务器端会生成 cookie 信息,返回给客户端。第二次请求时,把 cookie 信息一起发送到服务器端,服务器端就会明白,第二次请求是与第一次请求有关系的。
客户端可以自己设置 cookie 信息。
cookie 可以通过铭文保存登录信息,即免登录。
http 协议是连完即断,只会短时间保存链接,即提高性能。
(四)URL 组成
1.URL 可以说就是地址,uniform resource locator 统一资源定位符,每一个链接指向一个资源供客户端访问。
schema://host[:port#]/path/ . . ./[;ur1-params][ ?query-string][#anchor]
https 默认端口443,http默认端口80。
#anchor 是锚点用于网页定位。
2.例如,通过下面的 URL 访问网页
http://www .magedu.com/pathon/index.htm1?id=5&name=python
访问静态资源时,通过上面这个 URL 访问的是网站的某路径下的 index.html 文件,而这个文件对应磁盘上的真实的文件。就会从磁盘上读取这个文件,并把文件的内容发回浏览器端。
3.scheme 模式、协议︰
http、 ftp、 https、file、mailto 等等。mysql 等都是类似这样写。
http︰超文本传输协议用于在 Web 浏览器和网站服务器之间传递信息。
ftp︰用于在计算机网络上客户端和服务器之间进行文件传输的应用层协议,包括 FTP 服务器和 FTP 客户端两个组成部分。
https︰在 HTTP 的基础上加入了 SSL 协议,SSL 依靠证书来验证服务器的身份,并为浏览器和服务器之间的通信加密。
file︰从根开始一个路径。
mailto︰电子邮件协议,是指使用 E-Mail 客户端程序时,在预先的配置,即接收邮件服务器和发送邮件服务器中使用的协议。
4.host:port(端口)
www.magedu.com:80,80端口是默认端口可以不写。对外服务器一般不会改变80端口,就算改80端口,第一回发出的请求肯定是在80端口,也是由80端口内部转发。
域名解决了 IP 地址存在的问题。域名会使用 DNS 解析,域名会解析成 IP 才能使用。实际上会对解析后返回的 IP 的 TCP 的80端口发起访问。
5./path/to/resource
path,指向资源的路径,包含着参数。参数的变化不重要,路径的变化代表一切。
pathon/index.htm1 为资源。
6.?key1=value1&key2=value2
query string,代表着客户端发送的数据。查询字符串,问号分割,后面 key=value 形式,且使用&符号分割。
四、HTTP消息
消息分为: Request、Response。
Request: 浏览器向服务器发起的请求
Response :服务器对客户端请求的响应
请求和响应消息都是由请求行、Header 消息报头、Body 消息正文组成。
(一)请求
1.请求消息行:请求方法 Method 请求 路径 协议版本 CRLF
请求头信息 格式化头信息
GET/HTTP/1.1
Host:www.magedu.com
User-Agent:Mozilla/5.0(Windows NT 6.1: Win64: x64: rv:56.0)Gecko/20100101Firefox/56.0 Accept:text/html,application/xhtml+xml,application/xml:Q=0.9,*/*;Q=0.8
Accept-Laneuage:zh-CN,zh:Q=0.8.en-US:Q=0.5.2m:Q=0.3 Accept-Encoding: gzid, deflate
Cookie:53gid2=10019286380004:53revisit=1512357945900: 53uvid=1: onliner_zdfq72145423=0: ir
Connection: keepalive
Upgrade-Insecure-Requests:1
第一行:请求方法 get 路径 协议版本 CRLF(代表此处为回车键)
2.请求方法 Method
GET 请求获取 URL 对应的资源
POST 提交数据至服务器端
HEAD 和GET 类似,不过不返回消息正文(postman 工具比 HEAD 更好,可以模拟浏览器发出请求)
GET 和 POST 的差异在于提交的参数放在哪儿。
3.常见传递信息的方式
GET 方法使用 QueryString
http://www.magedu.com/pathon/index.html?id=5&name=python
通过查询字符串在 URL 中传递参数
POST 方法提交数据
http://127.0.0.1:9999/xxx/yyy?id=5&name=magedu
使用表单提交数据,文本框 input 的 name 属性分别为 age、weight、height
请求消息如下
POST /xxx/yyy?id=5&name=magedu HTTP/1.1 HOST:127.0.0.1:9999
content-length:26
content-type:application/x-www-form-urlencoded
age=5&weight=80&height=170
(请求报文,会发往服务器端。)
3、URL 中本身就包含着信息
http://www.magedu.com/python/student/001
称为 restful 风格,即通过 :url 把该表达的都表达出来,例:www.magedu.com/python/student/001
restful 风格通过 GET 表示取出,POST 表示增加。
响应
响应消息行:协议版本 状态码 消息描述 CRLF
响应头信息
HTTP/1.1 200 OK
Date:Sat,23 Dec 2017 12:03:17 GMT
Content-Type: text/html: charset=utf-8
Transfer-Encodine:chunked
Connection: keep-alive
Vary:Accept-Encoding
Cache-Control: private, max-aee=10
Expires:Sat,23 Dec 2017 12:03:27 GMT
Last-Modified:Sat,23 Dec 2017 12:03:17 GMT
X-UA-Compatible: IE=10
x-Frame-0ptions:SAMEORIGIN
Content-Encoding:gzip
status code 状态码
状态码在响应头第一行
1xx提示信息,表示请求已被成功接收,继续处理
2xx表示正常响应
200正常返回了网页内容
3xx 重定向
301面永久性移走,永久重定向。返回新的URL,浏览器会根据返回的 url 发起新的 request 请求
302 临时重定向
304资源未修改,浏览器使用本地缓存。
4xx 客户端请求错误
404 Not Found,网页找不到,客户端请求的资源有错
400请求语法错误
401请求要求身份验证
403服务器拒绝请求
5xx 服务器端错误
500服务器内部错误
502上游服务器错误,例如 nginx 反向代理的时候.
(二)无状态,有连接和短连接
无状态,指的是服务器无法知道2次请求之间的联系,即使是前后2次同一个浏览器也没有任何数据能够判断出是同一个浏览器的请求。后面可以通过 cookie、session 来判断。
有连接,是因为它基于 TCP 协议,是面向连接的,需要3次握手、4次断开。
短连接,Http 1.1之前,都是一个请求一个连接,而 Tcp 的连接创建销毁成本高,对服务器有很大的影响。所以,自 Http 1.1开始,支持 keep-alive,默认也开启,一个连接打开后,会保持一段时间(可设置),浏览器再访问该服务器就使用这个 Tcp 连接,减轻了服务器压力,提高了效率。
推荐图书《HTTP 权威指南》。