HTTP
HTTP,Hyper Text Transfer Protocol,即超文本传输协议。是Internet上最主要的web应用层标准。B/S架构的应用程序使用HTTP在客户端与服务器之间传送数据。HTTP可以传送任何格式的数据,从文本到图像甚至视频都可以传输。HTP基于TCP/IP通信协议来传送数据。
B/S,即Browser/Server,是web兴起后的一种网络结构模式。B/S使用web浏览器作为客户端,所以B/S可以看作是C/S的一种特殊情况。
HTTP工作原理
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即WEB服务器发送所有请求。
Web服务器根据接收到的请求后,向客户端发送响应信息。
HTTP默认端口号为80,但是也可以改为8080或者其他端口。
HTTP是无状态的。无状态是指协议对于事务处理没有记忆能力。无状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。
HTTP协议通信流程
域名解析本身不是HTTP的一部分,客户端在与服务端建立TCP连接之前就通过DNS服务器完成DNS解析工作。
HTTP消息结构
Request的消息结构:
【请求方法】 【URL】 【协议版本】
【头字段1】: value1
...
【头字段N】: valueN
【消息体】
由消息头(http head)和消息体(http body)两部分组成。消息头必须遵循上述格式,消息体没有固定格式。
head和body之间以一个空行分隔。常用的消息体格式包括HTML、XML、JSON等。
Response的消息结构:
【协议版本】 【响应码】 【响应码含义】
【头字段1】: value1
...
【头字段N】: valueN
【消息体】
消息结构仍由两部分组成,与request不同的是,第一行由协议版本和响应码组成。
示例:使用GET方法请求百度首页。
客户端请求:
GET /index.html HTTP/1.1
Host: www.baidu.com
服务端响应:
HTTP/1.1 200 OK
Date: Sun, 17 Sep 2017 09:31:07 GMT
Content-Type: text/html
Content-Length: 14613
Last-Modified: Thu, 14 Sep 2017 03:04:00 GMT
Connection: Keep-Alive
Vary: Accept-Encoding
Set-Cookie: BAIDUID=B0BE15AB9B826700DABA32CFEA847004:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=B0BE15AB9B826700DABA32CFEA847004; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1505640667; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
Pragma: no-cache
Cache-control: no-cache
Accept-Ranges: bytes
<!DOCTYPE html><!--STATUS OK-->
<html>
<head>
......
HTTP请求方法
HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法。
HTTP1.1新增了五种请求方法:OPTIONS, PUT, DELETE, TRACE 和 CONNECT 方法。
整理一下:
GET方法请求指定的页面信息,并返回响应头和响应主体。一般来说GET方法应该只用于数据的读取,GET请求会显示请求的资源,因此GET方法被认为是不安全的方法。
HEAD方法跟GET方法一样,请求指定页面的信息。不同的是,HEAD只获取消息头,不获取消息体。
POST方法会向指定资源提交数据,请求服务器进行处理。如:表单数据提交、文件上传等,请求数据会被包含在请求体中。POST方法是非幂等的方法,因为这个请求可能会创建新的资源或修改现有资源。
PUT方法会身向指定资源位置上传其最新内容,PUT方法是幂等的方法。通过该方法客户端可以将指定资源的最新数据传送给服务器取代指定的资源的内容。
DELETE方法用于请求服务器删除所请求URI所标识的资源。DELETE请求后指定资源会被删除,DELETE方法也是幂等的。
CONNECT方法是HTTP/1.1协议预留的,能够将连接改为管道方式的代理服务器。通常用于SSL加密服务器的连接与非加密的HTTP代理服务器的通信。
OPTIONS方法与HEAD类似,一般用于客户端查看服务器的性能。 这个方法会请求服务器返回该资源所支持的所有HTTP请求方法,该方法会用'*'来代替资源名称,向服务器发送OPTIONS请求,可以测试服务器功能是否正常。JavaScript的XMLHttpRequest对象进行CORS跨域资源共享时,就是使用OPTIONS方法发送嗅探请求,以判断是否有对指定资源的访问权限。
响应码
1xx:信息。表示服务器已经收到请求,但需要进一步处理,请客户端等待。
2xx:成功。处理成功。
3xx:重定向。请求的地址已经被重定向,需要客户端重新发起请求。
4xx:客户端错误。请求中的参数或内容有错误。
5xx:服务端错误。
上述响应码为HTTP标准错误,在开发中如需定自定义响应码,则需要避开该范围。
基于HTTP的网站开发
当前的主流web服务器都实现了主流语言的可调用接口标准:
CGI:Common Gateway Interface,CGI规范允许web服务器执行外部程序,并将它们的输出发送给浏览器,CGI将web的一组简单的静态超媒体文档变成一个完整的新的交互式媒体。
WSGI:Web Server Gateway Interface,是一套专门为python语言制定的网络服务标准接口。
从客户端的角度看,它的每次访问是通过HTTP访问web服务器从而获得某种服务(下载文件、查看页面、订购商品等)的,但实际上web服务器仅起到桥梁作用,即将浏览器的HTTP请求解码,转换成服务端程序能够识别的接口调用方式,然后将服务端程序生成的返回封装成HTTP Response,并返回给浏览器。
服务端程序、web服务器、客户端之间的关系:
最简单的服务端程序可以是直接读取某文件或返回固定的网页内容。稍复杂一些的服务端程序需要处理客户端通过HTTP、URL、HTML中传入的参数、动态执行逻辑代码、在数据库或缓存中读写数据等一系列操作,才能最终生成调用结果。
参考:
https://docs.python.org/3/library/http.html
https://docs.python.org/3/library/cgi.html
https://docs.python.org/3/library/wsgiref.html
https://www.w3cschool.cn/http/
http://www.runoob.com/http/http-tutorial.html
https://zh.wikipedia.org/wiki/HTTP状态码
https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol