http报文
http报文分为请求报文与响应报文
请求报文
请求报文由:
请求行
请求头
请求体
三部分组成
-
请求行组成
1.请求方式:上图中,请求方式为GET。GET和POST是最常见的请求方式,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE
2.请求对应的URL地址,它和报文头的Host属性组成完整的请求URL
3.协议名称及版本号,如上图的‘HTTP/1.1’ -
请求头中的常用属性
1.Accept:请求报文可通过一个“Accept”报文头属性告诉服务端 客户端希望接受什么类型的数据
【Content-Type:表示发送端(可能是客户端/服务器)发送的实体数据的数据类型,注意区别】
2.Cookie:客户端的Cookie就是通过这个报文头属性传给服务端的
3.Referer:表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com(通常用来做流量统计)
如果从浏览器地址栏里直接输入地址,则请求头没有referer
4.Cache-Control:对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的 -
请求体
请求体以‘键:值’的表示向服务器发送的数据
响应报文
响应报文由:
响应行
响应头
响应体
三部分组成
- 响应行组成
由协议及版本,状态码及状态描述
以下为常见的状态码:
-
301
表示永久重定向。如果浏览器收藏了这个URL,那么浏览器会修改收藏的url为新的url -
302
表示临时重定向,不会替换以前的url。重定向的url只有在Cache-Control的允许下才进行缓存 -
303
临时重定向,且必须用get方式请求
https://www.cnblogs.com/wuguanglin/p/redirect.html
-
404
你请求的资源不存在 -
401
未授权。一般来说该错误消息表明你首先需要登录(输入有效的用户名和密码)。如果你不输入这些信息,就会有401错误,这意味着验证信息出错,服务器无法识别你的身份。 -
403
服务器拒绝了你的请求。有句话叫“拉不出屎千万别怪地球没引力”,因为出现403是因为服务器拒绝了你的地址请求,或者你根本没权限访问网站,提供身份验证也没用,也就是说,用户被禁止访问了。然而除非与Web服务器管理员联系,否则一旦遇到403状态码都无法自行解决。 -
503
服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态 -
500
服务器程序出错 -
200
服务器成功返回内容 -
304
如果浏览器中有该资源的缓存(意味着你之前已经访问过该资源),且还没有过期。那么当你再次访问该资源时,会先检查该资源在服务器端是否有过更新,如果没有更新,那么服务器就会返回304,告诉浏览器使用缓存中的内容,这样就减少了网络开销。
我们可以将该状态码理解为:将请求重定向到浏览器本身
为方便记忆,可看下表
状态码 | 定义 | 说明 |
---|---|---|
1XX | 信息 | 接到请求继续处理 |
2XX | 成功 | 成功的收到,理解,接受 |
3XX | 重定向 | 为了完成请求需要进行另一部措施(如直接重浏览器缓存获取资源,或跳转到其他页面) |
4XX | 客户端错误 | 请求语法有错误,不能完全符合要求 |
5XX | 服务器错误 | 服务器无法完成明显有效的请求 |
- 响应头
我们一起来讨论响应头中的一些重要属性
1.cache-control——用于控制浏览器中的缓存
其取值如下:
max-age
后面跟数字,表示缓存的秒数,一旦超出,则下次访问该资源就必须到服务器中取,而不是取缓存了
max-stale
后面跟数字,表示过期多久以内的,依旧可以使用,一般同max-age一起使用
no-cache
2.Etag
ETag是一个可以与Web资源关联的记号,并在HTTP响应头中将其传送到客户端。语气配合使用的是请求头中的if-None-Match属性。下面来解说两者是怎么作用的:
服务器端的资源都对应了一个Etag标记,用于表示该资源的更新状况。当你向服务器请求资源时,该资源的Etag标记就会随着响应头一起发给客户端,客户端会存储该值;下一次再访问时,客户端去除保存的etag值,将其添加到请求头中的if-None-Match中,发给服务器;服务器读取该值并与对应资源的Etag值进行对比,如果值不同,则意味着服务器端已经对该资源进行了更新,然后服务器就会返回新资源给客户端,如果值相同,则意味着资源未更新,于是服务器端向客户端发送状态码——304,即告诉客户端,资源未更新,请取缓存中的内容
可参见改文章:
https://www.cnblogs.com/kabi/p/6288700.html
- 响应体
这个不用多说,应该都明白的!
Get与Post请求的区别
get与post是http中发送请求的两种方式,他们底层都是基于tcp/ip的,而且他们也都能获取与发送数据,因此实际上他们并没有区别。
但是在RFC规范中,为他们各自定义了语义——即get用来获取数据,post用来发送数据。
然而在RFC规范的具体实现中,便产生了如下的(也是我们经常听见的)区别:
- 我们约定——GET使用URL传参。而POST将数据放在请求BODY中
- GET的URL会有长度上的限制,则POST的数据则可以非常大
这有两方面的原因
一是:早期浏览器会对URL长度进行限制
二是:URL长了,对服务器处理也是一种负担。原本一个会话就没有多少数据,现在如果有人恶意地构造几个几M大小的URL,并不停地访问你的服务器。服务器的最大并发数显然会下降,所以为了服务器的安全考虑,有限制 - POST比GET安全,因为数据在地址栏上不可见
- GET请求会被浏览器主动cache,而POST不会,除非手动设置
- GET可收藏为书签,而POST不能