http协议是应用层的协议,也是现阶段我们常用的网络协议,基本上访问前后台交互都是使用的http协议。
http协议的特点
无状态:请求一次返回一次,对请求事务没有记忆能力。
简单快速:协议结构简单,传输效率高效。
灵活多变:http也可以作为其他上层协议的载体。
http url格式
http://host:port/path
host 主机ip或域名
port 端口 默认为80
path 访问资源的路径
http请求
http请求的报文格式
请求行 (请求方法 请求的url 请求的http协议版本 )
请求头 (请求头名称:请求头名称对应的值)
此处空行
请求体 (请求的附带数据 )
如下图所示
http请求方法
get、post、head(获取请求资源响应消息报文头)、delete(删除指定资源)、put(存储资源)、options(询问支持的方法)、trace(发送出去的请求时如何加工修改)、connect(要求用隧道协议(tls、ssl)来连接代理)。一般常用的是get和post、get请求参数直接附带在url中,而post请求一般需要将请求参数放在请求体,也就是上图中的请求数据中。下图是请求实例
http响应
http响应报文的格式
响应行 (协议版本 响应code 响应msg )
响应头 (响应头名称:响应头名称对应的数据 )
此处空行
响应体 (响应数据 )
下图是请求实例
http报文头
1、通用报头
既可以出现在请求报头,也可以出现在响应报头中
* Date:表示消息产生的日期和时间
* Connection:允许发送指定连接的选项,例如指定连接是连续的,或者指定“close”选项,通知服务器,在响应完成后,关闭连接
* Cache-Control:用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制)
2、请求报头
请求报头通知服务器关于客户端求求的信息,典型的请求头有:
* Host:请求的主机名,允许多个域名同处一个IP地址,即虚拟主机
* User-Agent:发送请求的浏览器类型、操作系统等信息
* Accept:客户端可识别的内容类型列表,用于指定客户端接收那些类型的信息
* Accept-Encoding:客户端可识别的数据编码
* Accept-Language:表示浏览器所支持的语言类型
* Connection:允许客户端和服务器指定与请求/响应连接有关的选项,例如这是为Keep-Alive则表示保持连接。
* Transfer-Encoding:告知接收端为了保证报文的可靠传输,对报文采用了什么编码方式。
3、响应报头
用于服务器传递自身信息的响应,常见的响应报头:
* Location:用于重定向接受者到一个新的位置,常用在更换域名的时候
* Server:包含可服务器用来处理请求的系统信息,与User-Agent请求报头是相对应的
4、实体报头
实体报头用来定于被传送资源的信息,既可以用于请求也可用于响应。请求和响应消息都可以传送一个实体,常见的实体报头为:
* Content-Type:发送给接收者的实体正文的媒体类型
* Content-Lenght:实体正文的长度
* Content-Language:描述资源所用的自然语言,没有设置则该选项则认为实体内容将提供给所有的语言阅读
* Content-Encoding:实体报头被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。
* Last-Modified:实体报头用于指示资源的最后修改日期和时间
* Expires:实体报头给出响应过期的日期和时间
特殊的请求格式mutilpart/form-data
这种请求格式是基于post请求的,我们一般用为表单请求。如下图实例
POST /t2/upload.do HTTP/1.1
User-Agent: SOHUWapRebot
Accept-Language: zh-cn,zh;q=0.5
Accept-Charset: GBK,utf-8;q=0.7,*;q=0.7
Connection: keep-alive
Content-Length: 60408
Content-Type:multipart/form-data; boundary=ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC (这里指定content-type为multipart/form-data ,并且定义boundary)
Host: w.sohu.com
空行
–ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC (–boundary 、空行 + –boundary分割传递的数据)
Content-Disposition: form-data;name=”desc”
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
空行
this is a desc (参数desc对应的值)
–ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC
Content-Disposition: form-data;name=”pic”; filename=”photo.jpg” (传递文件时传递文件名)
Content-Type: application/octet-stream
Content-Transfer-Encoding: binary
空行
[654dfasalk;af&6…] (此处是参数pic 对应的图片的二进制数据)
–ZnGpDtePMx0KrHh_G0X99Yef9r8JZsRJSXC– (–boundary– 代表结束符 )