HTTP协议做为网络传输的基本协议,有着普遍的应用。
HTTP协议的完整内容不少,可是其核心知识却又简单精炼。
HTTP协议:消息的分类 请求消息 响应消息
HTTP特色:无链接,无链接的含义是限制每次链接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开链接,采用这种方式能够节省传输时间 。html
无状态: 指协议对于事务处理没有记忆能力。json
缺乏状态意味着若是后续处理须要前面的信息,则它必须重传,这样可能致使每次链接传送的数据量增大。浏览器
另外一方面,在服务器不须要先前信息时它的应答就较快。
HTTP协议消息的基本格式:缓存
用来指出HTTP消息的一些属性,它们有固定的格式;服务器
部分是传输的实际内容,它们的格式是任意的,一般用Content-Type头来指定。网络
在请求消息和响应消息中具体格式略有区别,它们表示的按理说应该是HTTP消息最基本的部分。
不管是HTTP请求仍是HTTP响应,首行都是有的,不然会出现不可饶恕的解析错误;
然而头部和正文是可选的,不过实际过程当中,多多少少都要包含一些基本的头。 首行和头部都是以进行ASCII编码,正文部分的编码任意了。
在实际的开发中,发送的文本消息时常会碰到乱码的问题。
一般约定以UTF-8格式进行编码和解码, HTTP消息是基于TCP协议的上层应用协议。
TCP协议是网络流协议的一种。
抽象地讲,就是从一台主机一个字节一个字节有序地传输到另外一台主机。对于HTTP协议来讲,天然保持了这种有序性,即按照首行、头部、正文的顺序进行传输。
首行和头部都是ASCII文本流,正文部分是字节流。一个特殊的控制结构CRLF用来控制每一个部分的结束。
CRLF是回车符和换行符的意思,它们是两个特殊的ASCII字符。
CR是回车符(\r),在ASCII中的编码是13;
LF是换行符(\n),在ASCII中的编码是10.app
GET /simple.html HTTP/1.1 ——- 首行
Accept: text/html — Accept-Language: zh-cn Accept-Encoding: gzip, deflate — 头部
User-Agent: Mozilla/4.0 Host: localhost:8080 Connection: Keep-Alive — ——- 空白行表示头部的结束编码
接下来的内容是正文部分 能够清楚地看到,第一行是首行,以CRLF标志其结束;spa
接下来是头部,含有多个消息头,每行定义一个消息头,以CRLF标志其结束;设计
一个单独的CRLF(紧接着上一个CRLF)表示整个头部的结束,接下来是正文部分。
在这个示例中,正文部分为空 它们在消息实体中是连续的片断,并不像代码中所示那样有换行的结构。
换句话说,原始的消息应该是以下形式:
GET /simple.html HTTP/1.1
Accept: text/html
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0
Host: localhost:8080
Connection: Keep-Alive
HTTP请求 以前已经说过。
HTTP请求消息分为三个部分:
其中请求头部的格式咱们已经见过。
HTTP请求:方法 首先列出最经常使用的
HTTP方法: GET POST PUT PATCH DELETE HEAD OPTIONS
每一个HTTP方法,都是有一些HTTP协议要求的。
好比说GET方法请求的资源,浏览器端通常都会有缓存,下次请求的时候可能从缓存中去取就够了,服务器不用再重复发送相同的资源了;
可是服务器若是将获取资源的接口的方法定义为POST,那么浏览器端就不会再对资源进行缓存了,即便每次取到的都是一样地内容,都会请求服务器从新发送一遍。
因此说,将请求资源的接口的方法定义为POST而不是GET,就是一种不合理的设计。
再好比,GET方法的请求消息是不能定义消息体的,HEAD方法的请求其响应消息是不包含消息体的。
这些都是HTTP协议对于HTTP方法的约束。
HTTP请求:路径 路径的基本格式通常是: basic-path[?query-string] 问号后面的部分就是query-string。
它的格式是任意的,只要客户端和服务器约定好必定的形式便可。这个部分通常是请求参数的附加。
以前说过,GET方法是不包含请求体的,因此GET方法的HTTP请求想要附加参数只能使用这种方式。
固然其余方法也是可使用这种方式附加参数,只要服务器赞成就能够了。query-string的格式任意,但在客户端和服务器之间也有预先定好的约定,即键值对的形式。
query-string能够表示成一系列键值对的集合,用如下方式表示: k1=v1&k2=v2&k3=&k4 在这里。
&分隔不一样的键值对,=表示键和值得关系,能够看到一共有四个键值对关系,它们是: k1: v1 k2: v2 k3: 空字符串k4: 起码该键被定义了 通常来讲,键值对要写成k=v的形式,可是k=和仅仅一个k都是容许的,前者表示键k的值是空字符串,后者表示键k被定义了,可是其值是什么并不关心。
HTTP请求头 HTTP请求头格式与以前所说的消息头格式没什么两样,就是以冒号分隔的键值对。HTTP请求头中,既包含预约义的头(如Content-Type、Content-Length等),也支持自定义头。
既可用于请求消息,也可用于响应消息,是规定请求正文内容格式的头部。例如利用这个头部,咱们能够规定正文的格式为纯文本格式、表单格式、XML格式、JSON格式、图像格式等。
例如==Content-Type:application/json==就表示JSON文本格式。 http消息头大全 HTTP响应 HTTP响应消息的基本格式也是同样的。
包含三个部分:
响应行
响应头部
响应正文
响应行的基本格式是: 版本号 状态码 状态文本 例以下面的响应行: HTTP/1.1 200 OK 其对应关系为: 版本号:HTTP/1.1 状态码:200 状态文本:OK