http协议概念
协议是值计算机通信两台计算机之间进行通信所必须遵守的规定过规则,超文本传输协议(HTTP)是一种通信协议,它允许超文本语言(HTML)文档从web服务器传输到客户端的浏览口之前使用的是http/1.1版本。
Web服务器,浏览器代理服务器
当我们打开浏览器,在地址栏输入URL,然后我们就看到了网页,原理为?
实际在我们输入URL后,我们的浏览器给Web服务器发送了一个Request,Web服务器到Request后进行处理,生成相应的Request(对象),然后发送给浏览器,浏览器解析Request中的HTML,这样我们就看到了网页,
URL详解
https:www.tmall.com//
http:www.1foo.cn/Blog/index.html?cid=1
URL(Rniform Resource Locartor)地址用于描述一个网络上的资源,基本格式如下
schema://host[:port#]/path/…/[?query-string]
seheme: 指定低层使用的协议例如(http,https,ftp)
host: HTTP服务的ip地址或者域名
port# :HTTP服务器的默认端口号是80,这种情况就可以省略端口号,如果使用了别的端口号,就必须指明端口号,例如:http://www.cnlogs.com:8080/
path : 访问资源的路径
query-String :发送给Web服务器的数据
HTTP协议是无状态的
http是无状态的,同一个客户端的请求和上次请求没有对应关系,对http服务器来说,它并不知道两个请求来自一个客户端,为了解决这一问题Web程序引入了Cookie机制来维护,
<https://jingyan.baidu.com//article/fedf073780da6335ac897799.html)
打开一个网页需要浏览器发送很多此Request
1:当人在浏览器输入一个URL如:http://www/cnblogs.com的时候,浏览器发送一个Request区获取
2:浏览器分析Request中的html,发现其中有很多其他文件,如图片,css文件,js文件等
3:浏览器会自动发送Request区获取 图片,css文件,js文件
4:所有文件都被下载完成之后网页就显示出来额
Get和Post方法的区别
1:GET提交的数据会放在URL之后,以“?”分割URL传输数据,参数之间以“&”连接,如EditPosts.aspx?name=tes&id=123456. POST方法是把提交的数据放在HTTP包的Body中、
2:GET提交的数据大小有限制(因为浏览器对URL的长度有限制),POST方法提交的数据没有限制,
3:GET方法需要使用RequestString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
4:GET方式提交数据,会带来安全问题,例如一个登录页面通过GET方式提交数据是,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录中获得该用户的账号和密码
GET后退按钮 / 刷新无害,POST数据会被重新提交(浏览器应该告知用户数据会被重新提交)
GET书签可收藏,POST为书签不可收藏
GET能被缓存,POST不能缓存
GET编码类型application/x-www-form-url,POST编码类型encodedapplication/x-www-form-lencoded或multipart/form-data 二进制数据使用多重新编码。
GET历史参数保留在浏览器历史中,POST参数不会保存在浏览器历史中
GET对数据长度有限制当发送数据时,GET方法像URL添加数据,的长度是受到限制的(URL的最大长度为2048个字符),POST无限制
GET只允许ASCII字符。POST没有限制,也允许二进制数据
与POST先比,GET的安全性较差,因为所有发送的数据是URL的一部分,在发送密码或其他敏感信息时绝对不要使用GET ! POST比GET更安全,因为参数不会被报讯到浏览器历史或web服务器日志中。
GET的数据在URL中对所有人都是可见的POST的数据不会显示在URL中。
状态码
Response消息中的第一行叫做状态行,由HTTP协议版本号中,状态码,状态消息三部分组成
状态码用来告诉HTTP客户端,HTTP服务器是否产生了预期的Response
HTTP/1.1中的定义了5类状态码,状态码由三位数数子组成,第一个数子定义了响应的类别
1** 提示信息-表示请求已被成功接收,继续处理
2** 成功-表示请求已经被成功接收,理解,接收
3** 重定向-要完成请求必须进行更进一步的处理
4** 客户端错误-请求有语法错误或者请求无法实现
5** 服务器端错误-服务器未能实现合法的请求
常见状态码
200 OK
最常见的就是成功响应状态码200,表示请求被成功的完成,所请求的资源发送回给客户端
302Found
重定向,新的URL会在response中的Location中返回,浏览器将会自动使用新的URL发出新的Request例如在IE中输入,http://www.google.com.HTTP服务器会返回302,IE收到Response中LOcation header的新URL,重新发送了一个Request
304Not Modified
代表上次的文档已经被缓存了,还可以继续使用
400 Bad Request
服务器收到请求,但是拒绝提供服务(例如服务器仅提供了get请求的方法,但是客户端发送的是post请求)
404Not Found
请求的资源不存在(输错了URL)出现404一定是路径不对
500 Internal Server Error
服务器发生了不可预期的错误
503 Server Unavailable
服务器当前不能处理客户端的请求,一段时间后可能恢复正常
HTTP Request header
使用Fiddler能很方便的查看Reques header,点击Inspector tad–>Request–>headers
Cache头域
If-Moodified-Since
作用:把浏览器端缓存页面的最后修改事件发送到服务器区,服务器会吧这个事件和服务器上的实际文件的最后修改的事件进行对比,若时间一致返回304,客户端就直接使用本地缓存文件,若不一致就返回200和新的文件内容,客户端接收到之后,会丢弃旧文件,把新文件缓存,并且显示浏览器中
If-None-Match
作用:If-None-Match和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。当用户再次请求资源时,将在HTTP Request中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态码告诉客户端使用了本地缓存文件。否则返回200状态码和新的资源和ETag。使用这样的机制将提高网站性能
Pragma
作用:防止页面被缓存,在HTTP/1.1版本中,它和Cache-Control:no-cache作用一样
Pargma只有一个方法
注意:在HTTP/1.0版本中,只有实现了Pragema:no-cache,么有实现Cache-Control
Cache-Control
作用:是一个非常重要的规则。用来指定Response-Request遵循的缓存机制,指令如下:
Cache-Control:Public 可以被任何缓存所缓存()
Cache-Control:Private 内容只有缓存到私有缓存中
Cache-Control:no-cache 所有内容都不会被缓存
Client头域
Accept
所用:浏览器可以接收的媒体类型
例如:Accept:text/html 代表浏览器可以接受服务器发回的类型为text/html 也就是html文档
如果服务器无法返回text/html类型的数据,服务器应该赶回一个406的错误(non acceptable)
通配符“”代表任意类型
例如:accept:/*代表浏览器可以处理所有类型,(一般浏览器发送给服器的就是这个)
Accept-Enocding
作用:浏览器申明自己接收的编码方式,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)(注意:不只是字符编码)
例如:Accept-Encoding:gzip,deflate
Accept-Language
作用:浏览器申明自己接收的语言
语言跟字符集的与别:中文是语言,其中有很多字符集,如:big5,gb2312,gbk等等
User-Agent
作用:告诉HTTP服务器,客户端使用的操作系统和浏览器的名称和版本
Accept-Charset
作用:浏览器中申明自己接收的字符集,这就是各种字符集和字符编码如:gb2312,utf-8(通常我们说Charset包括了相应的字符编码方案);
Cookie/Login头域
Cookie:
作用:最重要的是header,将cookie的值发送给HTTP服务器
Entity头域:
Content-Length
作用:发送给HTTP服务器数据的长度。
例如:Content-Type:application/x-www-form-urlencoded
Miscellaneous头域
Referer:
作用:提供了Request的上下文信息的服务器,告诉服务器我从那个链接过来的,比如主页上的链接链接到另一个链接,他的服务器能够从HTTP Referer中统计处每天有多少访问量
Transport头域
Connection:
Host(发送请求时,该报头域需要的)
作用:请求报头域主要用于指定被请求的资源Internet 主机和端口号,它通常从HTTP URL中提取出来的