为什么做web前端要了解http标准?因为浏览器要从服务端获取网页,网页也可能将信息再提交给服务器,这其中都有http的连接。web系统既然和http链接有瓜葛,你就必须去了解它。我将从一下几个方面讲解一下http标准:
- http请求的过程
- http状态码的意义
- http头部信息
- cookie状态管理
- 方法Get POST
http请求的过程
1、连接
当我们输入一个请求时,首先要建立一个socket连接,因为socket是通过ip和端口建立的,所以之前还有一个DNS解析过程,把域名变成ip,如果url里不包含端口号,则会使用该协议的默认端口号。
DNS的过程是这样的:首先我们知道我们本地的机器上在配置网络时都会填写DNS,这样本机就会把这个url发给这个配置的DNS服务器,如果能够找到相应的url则返回其ip,否则该DNS将继续将该解析请求发送给上级DNS,整个DNS可以看做是一个树状结构,该请求将一直发送到根直到得到结果。现在已经拥有了目标ip和端口号,这样我们就可以打开socket连接了。(具体可参考:从输入URL到页面加载完成都发生了什么?)
2、请求
连接成功后,web浏览器开始向web服务器发送请求,这些请求一般是GET或者POST请求。POST请求表单(form)参数传递GET命令的格式为:路径/文件名
3、应答
Web服务器接收到这个请求之后开始处理。服务器从它的文档空间空搜索子目录的文件。如果找到该文件,则把该文件内容传输给web浏览器。同时,为了告知浏览器,web服务器会传输一些HTTP头信息,HTTP头信息和信息体之间会有一行空行隔开,常用的HTTP头信息有:
- HTTP 1.0 200 OK这是web服务器应答的第一行,列出正在运行的HTTP的版本号和应答代码。代码200代表请求完成。(具体代码请参考常见的iis日志代码)
- MIME_Version:1.0 它指示MIME类型的版本
- content_type:类型 这个头信息非常重要,它指示HTTP体信息的MIME类型。如:content_type:text/html 指示传送的数据是HTML文档。
- content_length:长度值 它指示HTTP体信息的长度(字节)。
4、关闭连接
当应答结束后,Web浏览器与Web服务器必须断开,以保证其它Web浏览器能够与Web服务器建立连接。
http状态码的意义
1xx:信息,请求收到,继续处理
2xx:成功,行为被成功地接受、理解和采纳
3xx:重定向,为了完成请求,必须进一步执行的动作
4xx:客户端错误,请求包含语法错误或者请求无法实现
5xx:服务器错误,服务器不能实现一种明显无效的请求
100系列码
从100到199范围的HTTP状态码是信息报告码。基于各种原因考虑,大多数情况下我们是 很少看见这些代码的。首先,如果一个浏览器尝试访问一个网站,而网站返回这些代码时,它们往往都不会显示在屏幕上。它们只是浏览器使引用的内部码。另外, 这些代码不常见的另外一个原因是起初HTTP标准不允许使用这一范围的状态码。就其本身而言,它们也一直没有被广泛地使用。
200系列码
从200到299范围的状态码是操作成功代码。同样的,在正常的Web上网中,你也很可能不 曾在屏幕上看到这些代码。相反的,这些代码是在浏览器内部使用的,用以确认操作成功确认和当前请求状态。虽然这些代码通常不显示,但是有一些故障排除工具 能够读到它们,就像和其它大多数的HTTP状态码一样,它们在错误诊断过程中是非常有用的。
300系列码
从300到399范围的状态码是重定向代码。本质上,它们告诉Web浏览器必须执行其它一些 操作以完成请求。基于这个命令的特点,它可以自动地执行,或者要求额外的用户输入。比如,状态码301表示一个特定资源已经被永久地先移除,因此将来所有 访问该资源请求都应该定向到一个特定的URL上。
400系列码
在400范围的状态码是客户端错误码。这种类型的错误码往往跟安全相关。比如,如果一个客户 端尝试访问一个未授权访问的资源,服务器就会返回一个状态码401。类似地,如果客户端尝试访问一个禁止的资源,在这种情况下客户端的认证状态是一样的, 那么服务器可能会返回一个状态码403,表示禁止对该资源进行访问。
如果请求不正确或客户端超时,400级错误码也可能被返回。然而,有一个400级的代码总是 具有误导性:404。虽然这个代码在技术上被归类为客户端错误,但是事实上它可以同时表示客户端或服务器上的错误。但这个错误码只是简单地显示为没有找到 请求的资源。当这个错误发生在客户端时,它往往表示的是网络连接问题。在其他时候,这个错误的发生还可能是由于资源已从服务器上转移或重命名而造成的。
500系列码
500级状态码表示的是服务器错误。比如,如果Web服务器超时,它就会产生一个504错 误。虽然,一个500级的错误往往表示的不是服务器的问题,而是在服务器上运行的Web应用的问题。比如,我自己的个人网站是用ASP编写的,它负责动态 生成HTML网页。在调试的过程中,有Bug的代码总会导致我的Web服务器返回HTTP状态码500,该代码是一般表示内部服务器错误。这个代码只是出 现问题了,并且HTTP无法解决该问题。
具体代码请参考常见的iis日志代码
http头部信息
我们任意打开一个网站如www.shell.com
可以看到Request Header(请求头)里的内容
其中包含:Accept、Accept-Charset、Accept-Encoding、Accept-language、Authorization、If-Match、If-None-Match、If-Modified-Since、If-Unmodified-Since、If-Range、Range、Proxy-Authenticate、Proxy-Authorization、Host、Referer、User-Agent
1、Accept
告诉WEB服务器自己接受什么介质类型,*/* 表示任何类型,type/* 表示该类型下的所有子类型,type/sub-type。
2、Accept-Charset
浏览器告诉服务器自己能接收的字符集。
3、Accept-Encoding
浏览器申明自己接收的编码方法,通常指定压缩方法,是否支持压缩,支持什么压缩方法(gzip,deflate)。
4、Accept-Language
浏览器申明自己接收的语言。语言跟字符集的区别:中文是语言,中文有多种字符集,比如big5,gb2312,gbk等等。
5、Authorization
当客户端接收到来自WEB服务器的 WWW-Authenticate 响应时,用该头部来回应自己的身份验证信息给WEB服务器。
6、If-Match
如果对象的 ETag 没有改变,其实也就意味著对象没有改变,才执行请求的动作,获取文档。
7、If-None-Match
如果对象的 ETag 改变了,其实也就意味著对象也改变了,才执行请求的动作,获取文档。
8、If-Modified-Since
如果请求的对象在该头部指定的时间之后修改了,才执行请求的动作(比如返回对象),否则返回代码304,告诉浏览器该对象没有修改。例如:If-Modified-Since:Thu, 10 Apr 2008 09:14:42 GMT
9、If-Unmodified-Since
如果请求的对象在该头部指定的时间之后没修改过,才执行请求的动作(比如返回对象)。
10、If-Range
浏览器告诉 WEB 服务器,如果我请求的对象没有改变,就把我缺少的部分给我,如果对象改变了,就把整个对象给我。浏览器通过发送请求对象的ETag 或者自己所知道的最后修改时间给 WEB 服务器,让其判断对象是否改变了。总是跟 Range 头部一起使用。
12、Range
浏览器(比如 Flashget 多线程下载时)告诉 WEB 服务器自己想取对象的哪部分。例如:Range: bytes=1173546
13、Proxy-Authenticate
代理服务器响应浏览器,要求其提供代理身份验证信息。
14、Proxy-Authorization
浏览器响应代理服务器的身份验证请求,提供自己的身份信息。
15、Host
客户端指定自己想访问的WEB服务器的域名/IP 地址和端口号。如Host:rss.sina.com.cn
16、Referer
浏览器向WEB 服务器表明自己是从哪个网页URL获得点击当前请求中的网址/URL,例如:Referer:http://www.ecdoer.com/
17、User-Agent
浏览器表明自己的身份(是哪种浏览器)。例如:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/36.0.1985.143 Safari/537.36
cookie状态管理
定义:客户端(浏览器)向服务器发出一个请求,服务器会将一小段字符串以set-cookie消息头的方式发回给客户端,浏览器会存储这一小段信息,当客户端再次向服务器发出请求时,在某些条件下,浏览器会自动发送存储的这一小段文本信息给到服务器端。某些条件是指:检测时间是否已经过期,检测路径是否符合规则。
1、什么是cookie?
浏览器在访问服务器时,服务器将一些数据以set-cookie消息头的形式发送给浏览器。浏览器会将这些数据保存起来。当浏览器再次访问服务器时,会将这些数据以cookie消息头的形式 发送给服务器。通过这种方式,可以管理用户的状态。
2、如何创建cookie
当然是服务器端创建,Response.SetCookie
3、获取cookie
当然是浏览器获取,Request.GetCookie
4、cookie的保存时间
可以设置cookie的过期时间,如果不设置cookie的过期时间,那么此cookie的过期时间就是浏览器回话期间,如果浏览器关闭,cookie就会失效。
5、如何清除cookie
把当前cookie的过期时间设置成过期时间就好了。
方法Get POST
在客户机和服务器之间进行请求-响应时,两种最常被用到的方法是:GET 和 POST。
GET - 从指定的资源请求数据。
POST - 向指定的资源提交要被处理的数据
有关 GET 请求的其他一些注释:
GET 请求可被缓存
GET 请求保留在浏览器历史记录中
GET 请求可被收藏为书签
GET 请求不应在处理敏感数据时使用
GET 请求有长度限制
GET 请求只应当用于取回数据
POST 方法
请注意,查询字符串(名称/值对)是在 POST 请求的 HTTP 消息主体中发送的:
POST /test/demo_form.asp HTTP/1.1
Host: w3schools.com
name1=value1&name2=value2
有关 POST 请求的其他一些注释:
POST 请求不会被缓存
POST 请求不会保留在浏览器历史记录中
POST 不能被收藏为书签
POST 请求对数据长度没有要求
下面的表格比较了两种 HTTP 方法:GET 和 POST。
GET | POST | |
后退按钮/刷新 | 无害 | 数据会被重新提交(浏览器应该告知用户数据会被重新提交)。 |
书签 | 可收藏为书签 | 不可收藏为书签 |
缓存 | 能被缓存 | 不能缓存 |
编码类型 | application/x-www-form-urlencoded | application/x-www-form-urlencoded 或 multipart/form-data。为二进制数据使用多重编码。 |
历史 | 参数保留在浏览器历史中。 | 参数不会保存在浏览器历史中。 |
对数据长度的限制 | 是的。当发送数据时,GET 方法向 URL 添加数据;URL 的长度是受限制的(URL 的最大长度是 2048 个字符)。 | 无限制。 |
对数据类型的限制 | 只允许 ASCII 字符。 | 没有限制。也允许二进制数据。 |
安全性 | 与 POST 相比,GET 的安全性较差,因为所发送的数据是 URL 的一部分。 在发送密码或其他敏感信息时绝不要使用 GET ! | POST 比 GET 更安全,因为参数不会被保存在浏览器历史或 web 服务器日志中。 |
可见性 | 数据在 URL 中对所有人都是可见的。 | 数据不会显示在 URL 中。 |