简单介绍http协议。
HTTP
HTTP请求
http请求由请求行,消息报头,请求正文三部分构成。
请求行
请求方法Method
HTTP协议的方法有:
- GET: 请求获取Request-URI所标识的资源
- POST: 在Request-URI所标识的资源后增加新的数据
- HEAD: 请求获取由Request-URI所标识的资源的响应消息报头
- PUT: 请求服务器存储或修改一个资源,并用Request-URI作为其标识
- DELETE: 请求服务器删除Request-URI所标识的资源
- TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
- CONNECT: 保留将来使用
- OPTIONS: 请求查询服务器的性能,或者查询与资源相关的选项和需求
Request-URI
URI 在于I(Identifier)是统一资源标示符,可以唯一标识一个资源。
URL在于Locater,一般来说(URL)统一资源定位符,可以提供找到该资源的路径,比如http://www.zhihu.com/question/21950864,但URL又是URI,因为它可以标识一个资源,所以URL又是URI的子集。URL与URI的区别,可以看看这里的解释。
Request-URI中可以有协议、域名、路径、参数、锚点。路径参数,本次请求的资源位置,紧跟请求域名的后面,服务器通过解析路径参数获取资源。
路径是用/分隔的一系列字符串,其意义在于对服务器资源进行统一定位,如:
https://www.baike.baidu.com/item/火腿/2140
。大多数情况下路径会代表服务器真实的文件路径。查询参数,放在请求地址后面。
- 以键值对形式进行标识,如:
userId=1
- 其中 userId 表示参数名称,1表示参数的值。参数名称是可以重复的。
请求地址与参数之间用?进行分隔,多个参数之间用&进行分隔,完整请求如下:http://www.madmk.com/a/b/c?userId=1&userId=1&age=18&sex=男
- 以键值对形式进行标识,如:
消息报头
消息报头(请求头)由一系列的键值对组成,允许客户端向服务器端发送一些附加信息或者客户端自身的信息,主要包括:Accept、Cache-Control、Cookie、Content-Type(通常会存放本次请求的基本设置(一般情况下由浏览器自动添加即可),以帮助服务器理解并解析本次请求的body体)。当然我们也可以自定义请求头内容,参数名称和参数意义必须事先和服务器约定好否则没服务器无法理解你传输请求头的意义会忽略自定义参数。
cookies是存放在每一条请求中的请求头上的特殊存储体 由于每次请求都会将全部cookies发送给服务器 所以不建议在cookies中存储大量数据 ,也因此产生了session技术。
请求正文
只有在发送POST
请求时才会有请求正文,GET
方法并没有请求正文。
请求正文(body)中存放要发送给服务器的数据。请求正文格式复杂多变,服务器会先根据请求头(消息报头)中的 Content-Type 获取其格式,然后再根据其格式进行解析,常见的格式如下:
Content-Type值 | 内容格式 | 消息示例 |
---|---|---|
application/from application/x-www-form-urlencoded |
表单传值,也是默认的解析形式,服务器会对表单进行解析 | userId=1&userId=1&age=18&sex=男 |
text/plain | 文本值,服务器会将本次请求的请求体当作普通字符串看待 | Hello world |
application/json | json,服务器会将请求体进行json解析,获取参数 | {“userId”:1,“sex”:“男”} |
application/xml | xml,服务器会将请求体进行xml解析,获取参数 | 参见 xml 标准格式 |
text/html | html,服务器会将请求体进行html解析,获取参数 | 参见 html 标准格式 |
HTTP响应
HTTP响应也由三部分组成,包括状态行,消息报头,响应正文。消息报头、响应正文与“HTTP请求”相似。
响应状态行
状态行也由三部分组成,包括HTTP协议的版本,状态码,以及对状态码的文本描述。例如:
1 |
HTTP/1.1 200 OK (CRLF) |
状态码
状态码由三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
- 1xx:指示信息 - 表示请求已接收,继续处理
- 2xx:成功 - 表示请求已被成功接收、理解、接受
- 3xx:重定向 - 要完成请求必须进行更进一步的操作
- 4xx:客户端错误 - 请求有语法错误或请求无法实现
- 5xx:服务器端错误 - 服务器未能实现合法的请求
常见状态代码、状态描述、说明:
- 200: OK - 客户端请求成功
- 400: Bad Request - 客户端请求有语法错误,不能被服务器所理解
- 401: Unauthorized - 请求未经授权,这个状态代码必须和
WWW-Authenticate
报头域一起使用 - 403: Forbidden - 服务器收到请求,但是拒绝提供服务
- 404: Not Found - 请求资源不存在,eg:输入了错误的URL
- 500: Internal Server Error - 服务器发生不可预期的错误
- 503: Server Unavailable - 服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
特点
HTTP的五大特点:
- 支持客户/服务器模式。
-
简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有
GET
、HEAD
、POST
。每种方法规定了客户与服务器联系的类型不同。由于HTTP
协议简单,使得HTTP
服务器的程序规模小,因而通信速度很快。 - 灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由
Content-Type
加以标记。 - 无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。早期这么做的原因是请求资源少,追求快。后来通过
Connection: Keep-Alive
实现长连接 - 无状态:
HTTP
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。