HTTP协议总结

文章属于总结,可参考好文http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html

请求类型

GET: 用于请求访问已经被URI(统一资源标识符)识别的资源,可以通过URL传参给服务器
POST:在Request-URI所标识的资源后附加新的数据。唯一的非幂等方法
PUT: 请求服务器存储一个资源,并用Request-URI作为其标识
HEAD:获得报文首部,与GET方法类似,只是不返回报文主体,一般用于验证URI是否有效。
DELETE:请求服务器删除Request-URI所标识的资源。
TRACE: 请求服务器回送收到的请求信息,主要用于测试或诊断
OPTIONS:请求查询服务器的性能,或者查询与资源相关的选项和需求,例如查询相应URI支持的HTTP方法。
CONNECT: 保留将来使用

MIME信息包括Header和Body

GET和POST的区别:

  1. GET提交的数据会放在URL之后,以?分割URL和传输数据,参数之间以&相连,如EditPosts.aspx?name=test1&id=123456. POST方法是把提交的数据放在HTTP包的Body中。
  2. GET提交的数据大小有限制,最多只能有1024字节(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
  3. GET方式需要使用Request.QueryString来取得变量的值,而POST方式通过Request.Form来获取变量的值。
  4. GET方式提交数据,会带来安全问题,比如一个登录页面,通过GET方式提交数据时,用户名和密码将出现在URL上,如果页面可以被缓存或者其他人可以访问这台机器,就可以从历史记录获得该用户的账号和密码。

请求头参数

Accept(请求) VS Content-Type(响应)

  • Accept:请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。

  • Content-Type:实体报头域用语指明发送给接收者的实体正文的媒体类型。

Accept-Charset(请求) VS Content-Type(响应)

  • Accept-Charset:请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。

  • Content-Type:例如Content-Type:application/json;charset=GB2312

Accept-Encoding(请求) VS Content-Encoding(响应)

  • Accept-Encoding:请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。

  • Content-Encoding:实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content-Encoding:gzip

Accept-Language(请求) VS Content-Language(响应)

  • Accept-Language:请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。

  • Content-Language:实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读者。eg:Content-Language:da

Authorization(请求) VS WWW-Authenticate(响应)

  • Authorization:请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。 必须与WWW-Authenticate响应头配合使用

  • WWW-Authenticate:响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。

WWW-Authenticate:Basic realm="Basic Auth Test!"  
//可以看出服务器对请求资源采用的是基本验证机制。

User-Agent(请求) VS Server(响应)

  • User-Agent:我们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息了。

  • Server:响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是

Server:Apache-Coyote/1.1

Cache-Control VS Pragma

  • Cache-Control:指定请求和响应遵循的缓存机制。缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(在请求消息或响应消息中设置Cache-Control并不会修改另一个消息处理过程中的缓存处理过程)。

    请求时的缓存指令包括no-cache、no-store、max-age、max-stale、min-fresh、only-if-cached.

    响应消息中的指令包括public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage。

    Cache-Control:Public 可以被任何缓存所缓存
    Cache-Control:Private 内容只缓存到私有缓存中
    Cache-Control:no-cache 强制每次请求直接发送给源服务器,而不经过本地缓存版本的校验。
    Cache-Control:no-store 用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。
    Cache-Control:max-age 指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。max-age>0 时 直接从游览器缓存中 提取; max-age<=0 时 向server 发送http 请求确认 ,该资源是否有修改
    Cache-Control:min-fresh 指示客户机可以接收响应时间小于当前时间加上指定时间的响应。
    Cache-Control:max-stale 指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。

Cache-Control:public,max-age=86400
  • Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了页面的本地拷贝;在HTTP/1.1版本中,它和Cache-Control:no-cache作用一模一样。Pargma只有一个用法, 例如: Pragma: no-cache
    注意: 在HTTP/1.0版本中,只实现了Pragema:no-cache, 没有实现Cache-Control

Date(响应) VS Age(响应)

  • Date:消息发送的时间,格式由rfc822定义。例如,Date: Mon, 04 Jul 2011 05:53:36 GMT。

  • Age:单位是秒,当代理服务器用自己缓存的实体去响应请求时,用该头部表明该实体从产生到现在经过多长时间了。

Date:Sat, 02 Jul 2011 20:45:57 GMT
Age:119294
//119294秒换算成33.1小时,Date加Age等于PageDate,说明本次请求走了代理服务器缓存,缓存命中。

参考:
http://www.xuebuyuan.com/1496558.html 理解http响应头中的Date和Age

Access-Control-Allow-Origin(响应) VS P3P(响应)

  • Access-Control-Allow-Origin :只有当目标页面的response中,包含了 Access-Control-Allow-Origin 这个header,并且它的值里有我们自己的域名时,浏览器才允许我们拿到它页面的数据进行下一步处理。如:
Access-Control-Allow-Origin: http://run.jsbin.io
  • P3P:用于跨域设置Cookie, 这样可以解决iframe跨域访问cookie的问题
P3P: CP=CURa ADMa DEVa PSAo PSDo OUR BUS UNI PUR INT DEM STA PRE COM NAV OTC NOI DSP COR

参考:

http://www.tuicool.com/articles/7FVnMz Access-Control-Allow-Origin与跨域
https://www.html5rocks.com/en/tutorials/cors/ Using CORS
http://www.cnblogs.com/EricaMIN1987_IT/p/3837436.html HTTP协议详解

Connection: keep-alive VS Connection: close

  • keep-alive:长连接(http1.1),从HTTP/1.1起,默认都开启了Keep-Alive,保持连接特性,简单地说,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。

  • close:短链接,请求一次就关闭。

If-Modified-Since(请求) VS Last-Modified(响应)

  • If-Modified-Since:把浏览器端缓存页面的最后修改时间发送到服务器去,服务器会把这个时间与服务器上实际文件的最后修改时间进行对比。如果时间一致,那么返回304,客户端就直接使用本地缓存文件。如果时间不一致,就会返回200和新的文件内容。客户端接到之后,会丢弃旧文件,把新文件缓存起来,并显示在浏览器中。例如:If-Modified-Since: Thu, 09 Feb 2012 09:07:57 GMT

  • Last-Modified:用于指示资源的最后修改日期和时间。Last-Modified也可用setDateHeader方法来设置。

If-None-Match(请求) VS ETag(响应)

  • If-None-Match或者If-Match:和ETag一起工作,工作原理是在HTTP Response中添加ETag信息。 当用户再次请求该资源时,将在HTTP Request 中加入If-None-Match信息(ETag的值)。如果服务器验证资源的ETag没有改变(该资源没有更新),将返回一个304状态告诉客户端使用本地缓存文件。否则将返回200状态和新的资源和Etag. 使用这样的机制将提高网站的性能。例如: If-None-Match: “03f2b33c0bfcc1:0”。

  • ETag:和If-None-Match 配合使用。

Range(请求) VS Content-Range(响应)

  • Range:可以请求实体的一个或者多个子范围(可用于断点续传)。例如:
表示头500个字节:bytes=0-499
表示第二个500字节:bytes=500-999
表示最后500个字节:bytes=-500
表示500字节以后的范围:bytes=500-
第一个和最后一个字节:bytes=0-0,-1
同时指定几个范围:bytes=500-600,601-999
但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200(OK)。
  • Content-Range:用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式:Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-length。例如,传送头500个字节次字段的形式:Content-Range:bytes0-499/1234如果一个http消息包含此节(例如,对范围请求的响 应或对一系列范围的重叠请求),Content-Range表示传送的范围。

响应码

状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

1xx:指示信息--表示请求已接收,继续处理
2xx:成功--表示请求已被成功接收、理解、接受
3xx:重定向--要完成请求必须进行更进一步的操作
4xx:客户端错误--请求有语法错误或请求无法实现
5xx:服务器端错误--服务器未能实现合法的请求

常见状态代码、状态描述、说明:

200 OK      //客户端请求成功
204 //请求已经成功,但没有数据,一般用于客户端通知
206 Partial Content//部分响应,用来断点下载
304 Not Modified//未修改,请使用缓存
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
403 Forbidden  //服务器收到请求,但是拒绝提供服务 - authorization
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后,可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

参考:
http://blog.csdn.net/buster2014/article/details/40083971 HTTP协议【详解】——面试常问
http://www.netingcn.com/http-status-204.html http状态码204理解

POST 301 302 303 307 Location

要实现重定向,客户端需要发送POST请求(原因是只有POST是非幂等,而303和307的存在,归根结底是由于POST方法的非幂等属性引起的,当然其实GET方法也是可以),服务器会返回Location=New Url,只是区别在于收到响应后的反应不同。

  1. 301(HTTP/1.0) 永久性跳转(Permanently Moved),表示原有资源已经失效,对于搜索引擎而已,会直接废弃原有链接记录的资源。
  2. 302(HTTP/1.0) 临时跳转(Temporarily Moved ),表示原有资源还存在,并且会询问用户是否跳转到新地址,如果同意,则会GET新地址。语义:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
  3. 303(HTTP/1.1) 不会询问用户,直接GET新地址。语义:对于POST请求,它表示请求已经被处理,客户端可以接着使用GET方法去请求Location里的URI。
  4. 307(HTTP/1.1) 会询问用户是否跳转到新地址,如果同意,则会继续POST新地址。语义:对于POST请求,表示请求还没有被处理,客户端应该向Location里的URI重新发起POST请求。

注意:为兼容很多HTTP1.1之前的浏览器,服务端在需要发出303状态码时,会选择用302状态码替代;而对于307的处理,则需要在响应实体中包含信息,以便不能处理307状态码的用户有能力在新URI中发起重复请求,也就是说,把重定向的页面展示给用户,让用户去点重定向URI链接(URI现在基本就是URL)。

参考:
http://www.cnblogs.com/cswuyg/p/3871976.html HTTP状态码302、303和307的故事
http://blog.csdn.net/grandPang/article/details/47448395 http状态码301和302详解及区别——辛酸的探索之路

CORS跨域问题

是一份浏览器技术的规范,提供了 Web 服务从不同网域传来沙盒脚本的方法,以避开浏览器(javascript)的同源策略(也就是不允许不同域js之间的通信调用)。

如果您的页面设置了CORS的返回头 Access-Control-Allow-Origin:* ,那么可以接收任何域名的 AJAX 请求。

参考:
http://blog.csdn.net/joyhen/article/details/21631833 前端解决跨域问题的8种方案(最新最全)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值