HTTP
HTTP
HTTP
什么是HTTP
HTTP(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议
HTTP的特点
- 支持B/S模式
- 简单快速,由于HTTP协议简单,使得HTTP服务器的程序规模小,通信速度快
- 灵活,http允许传输任意类型的数据 对象,正在传输的类型由Content-type加以标记
- 无连接,每次连接只处理一个请求 服务器四次分手之后即断开连接
- 无状态 http协议是无状态协议 即对于事务处理没有记忆能力
结构
header+body的结构 具体而言: 请求行/状态行 + 请求头/响应头 + 空行 + 请求体/响应体
请求行/状态行
- 请求报文
//请求行: 请求方法+路径+http版本
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
POST /search HTTP/1.1
- 响应报文
//状态行: http协议的版本+状态码+状态码的文本描述
HTTP/1.1 200 OK
HTTP协议的请求方法
有GET、POST、HEAD、PUT、DELETE、OPTIONS、TRACE、CONNECT 常见的是GET和POST
- GET
- 当客户端要从服务器中读取文档时会使用GET方法,传递的参数会拼接在URL后面以?衔接,俗称查询字符串(queryString),参数长度受限制,因为参数是拼接在URL后面,所以GET请求没有请求体
//GET请求报文:
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 //请求行
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, //请求头
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href="http://www.google.cn">www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
- POST
- 当客户要向服务器插入或者更新数据会使用POST方法,传递的参数会在请求体里面 大小不受限制
//POST请求报文:
POST /search HTTP/1.1 //请求行
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint, //请求头
application/msword, application/x-silverlight, application/x-shockwave-flash, */*
Referer: <a href="http://www.google.cn/">http://www.google.cn/</a>
Accept-Language: zh-cn
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
Host: <a href="http://www.google.cn">www.google.cn</a>
Connection: Keep-Alive
Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
FxlRugatx63JLv7CWMD6UB_O_r
hl=zh-CN&source=hp&q=domety //请求体
- GET和POST的区别
- GET请求没有请求体; POST请求有请求体
- GET请求的参数放在URL中发送 大小有限制; POST请求的参数可以放在URL后传递 也可以放在请求体中,放在请求体中大小不受限制
- GET参数明文,数据会被浏览器缓存,安全性较差; POST请求相对安全,通过抓包工具也是可以抓取到数据的,所以重要数据最好是加密传输
- GET设计用来查询,参数量小; POST设计用来插入,更新数据,安全要求高,数据量大
- GET像轿车能送货,速度快但能力有限; POST像货车,有货箱(请求体),运输量大且安全性高
- 传输的数据,GET像拿在手上,POST像放在荷包中
- GET像没有信纸,只有信访的信
请求头/响应头
请求/响应头部由关键字/值对组成,每行一对,关键字和值用英文冒号“:”分隔。请求头部通知服务器有关于客户端请求的信息,典型的头部有:
- Accept:请求的对象类型。如果是“/”表示任意类型,如果是指定的类型,则会变成“type/”
- Accept-Language: 使用的语言种类
- Accept-Encording:页面编码种类
- Accept-Charset:页面字符集
- User-Agent:提供了客户端浏览器的类型和版本。
- Host:连接的目标主机,如果连接的服务器是非标准端口,在这里会出现使用的非标准端口
- Connection:对于HTTP连接的处理,keep-alive表示保持连接,如果是在响应报文中发送页面完毕就会关闭连接,状态变为close。
- server表示服务器软件版本
- date标注了当前服务器的时间
- content-type表示了应答请求后返回的内容类型
空行
用来区分开头部
和实体
请求体/响应体
就是具体的数据了 也就是body部分,请求报文对应请求体
,响应报文对应响应体
状态码
分类
- 1xx: 表示目前是协议处理的中间状态,还需要后续操作。
- 2xx: 表示成功状态。
- 3xx: 重定向状态,资源位置发生变动,需要重新请求。
- 4xx: 请求报文有误。
- 5xx: 服务器端发生错误。
1xx 常见状态码
- 101 Switching Protocols。在HTTP升级为WebSocket的时候,如果服务器同意变更,就会发送状态码 101
2xx 常见状态码
- 200 OK是见得最多的成功状态码。通常在响应体中放有数据。
- 204 No Content含义与 200 相同,但响应头后没有 body 数据。
- 206 Partial Content顾名思义,表示部分内容,它的使用场景为 HTTP 分块下载和断电续传,当然也会带上相应的响应头字段Content-Range。
3xx 常见状态码
- 301 Moved Permanently即永久重定向
- 302 Found,即临时重定向
比如你的网站从 HTTP 升级到了 HTTPS 了,以前的站点再也不用了,应当返回301,这个时候浏览器默认会做缓存优化, 在第二次访问的时候自动访问重定向的那个地址,而如果只是暂时不可用,那么直接返回302即可,和301不同的是,浏览器并不会做缓存优化
- 304 Not Modified: 当协商缓存命中时会返回这个状态码
4xx 常见状态码
- 400 Bad Request: 开发者经常看到一头雾水,只是笼统地提示了一下错误,并不知道哪里出错了。
- 401 身份验证错误,此页要求授权
- 403 Forbidden: 这实际上并不是请求报文出错,而是服务器禁止访问,原因有很多,比如法律禁止、信息敏感。
- 404 Not Found: 资源未找到,表示没在服务器上找到相应的资源。
- 405 Method Not Allowed: 请求方法不被服务器端允许。
- 406 Not Acceptable: 资源无法满足客户端的条件。
- 408 Request Timeout: 服务器等待了太长时间。
- 409 Conflict: 多个请求发生了冲突。
- 413 Request Entity Too Large: 请求体的数据过大。
- 414 Request-URI Too Long: 请求行里的 URI 太大。
- 429 Too Many Request: 客户端发送的请求过多。
- 431 Request Header Fields Too Large请求头的字段内容太大。
5xx 常见状态码
- 500 Internal Server Error: 仅仅告诉你服务器出错了,出了啥错咱也不知道。
- 501 Not Implemented: 表示客户端请求的功能还不支持。
502 Bad Gateway: 服务器自身是正常的,但访问的时候出错了,啥错误咱也不知道。
503 Service Unavailable: 表示服务器当前很忙,暂时无法响应服务