HTTP详解(2)-请求、响应、缓存

 

 


1.HTTP请求格式

HTTP采用的是“消息头/消息体”的分割方式,消息头告诉对方这个消息是干什么的,消息体告诉对方怎么干。每一个HTTP包都分为HTTP头和HTTP体两部分。消息体是可选的,消息头是必须的。

客户端通过发送HTTP请求向服务器请求对资源的访问。它向服务器传递了一个数据块,也就是请求信息,HTTP请求由三部分组成:请求行、请求头和请求正文。

下面是一个HTTP请求的数据:


 

(1)请求行:请求方法URI协议/版本

第一行是“方法 URL 协议版本”:GET/sample.jsp HTTP/1.1 

“GET”代表请求方法,“/sample.jsp”表示URI,“HTTP/1.1代表协议和协议的版本。

URL完整地指定了要访问的网络资源,通常只要给出相对于服务器的根目录的相对目录即可,因此总是以“/”开头,最后,协议版本声明了通信过程中使用HTTP的版本。

3种常见的请求方法

1.GET

GET方法是默认的HTTP请求方法,例如当我们通过在浏览器的地址栏中直接输入网址的方式去访问网页的时候,浏览器采用的就是 GET 方法向服务器获取资源。

我们可以使用GET方法来提交表单数据,用GET方法提交的表单数据只经过了简单的编码,同时它将作为URL的一部分向服务器发送,因此,如果使用GET方法来提交表单数据就存在着安全隐患上。例如:
  Http://localhost/login.php?username=aa&password=1234

从上面的URL请求中,很容易就可以辩认出表单提交的内容。(?之后的内容)另外由于GET方法提交的数据是作为URL请求的一部分所以提交的数据量不能太大。这是因为浏览器对url的长度有限制



2.POST

  POST方法是GET方法的一个替代方法,它主要是向Web服务器提交表单数据,尤其是大批量的数据。 在请求头信息结束之后的两个回车换行之后(实际是空一行),就是表单提交的数据。如上面提到的post表单数据:

POST /index.php HTTP/1.1
Host: localhost
User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:10.0.2) Gecko/20100101 Firefox/10.0.2
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Language: zh-cn,zh;q=0.5
Accept-Encoding: gzip, deflate
Connection: keep-alive
Referer: http://localhost/
Content-Length:25
Content-Type:application/x-www-form-urlencoded
 
username=aa&password=1234

POST方法克服了GET方法的一些缺点。通过POST方法提交表单数据时,数据不是作为URL请求的一部分而是作为标准数据传送给Web服务器,这就克服了GET方法中的信息无法保密和数据量太小的缺点。因此,出于安全的考虑以及对用户隐私的尊重,通常表单提交时采用POST方法。

 

get与post的区别

 

  • GET在浏览器回退时是无害的,而POST会再次提交请求数据。

     

  • GET产生的URL地址可以被收藏为书签,而POST不可以。

     

  • GET请求会被浏览器主动缓存,而POST不会,除非手动设置。

     

  • GET请求只能进行url编码,而POST支持多种编码方式。

     

  • GET请求参数会被完整保留在浏览器历史记录里,而POST中的参数不会被保留。

     

  • GET请求在URL中传送的参数是有长度限制的,而POST没有。

     

  • 对参数的数据类型,GET只接受ASCII字符,而POST没有限制。

     

  • GET比POST更不安全,因为参数直接暴露在URL上,所以不能用来传递敏感信息。

     

  • GET参数通过URL传递,POST放在Request body中。

 

(2)请求头(Request Header)

请求头包含许多有关的客户端环境和请求正文的有用信息。例如,请求头可以声明浏览器所用的语言,请求正文的长度等。请求头采用键值对的形式:Keyword:Value,关键字不区分大小写,值有时区分大小写,有时不区分。关键字和值都只能是ASCII码 

 

2.HTTP响应格式

在接收和解释请求消息后,服务器会返回一个 HTTP 响应消息。与 HTTP 请求类似,HTTP 响应也是由三个部分组成,分别是:状态行、响应头和响应正文。如:

HTTP/1.1 200 OK
Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:23:42 GMT
Content-Length:112

<html>
    <head>
    <title>HTTP响应示例<title>
    </head>
    <body>
        Hello HTTP!
    </body>
</html>

(1)状态行

HTTP/1.1 200 OK

状态代码:状态代码由3位数字组成,表示请求是否被理解或被满足。状态代码的第一个数字定义了响应的类别,后面两位没有具体的分类。

状态码有五种可能的取值: 
1xx: 指示信息—表示请求已接收,继续处理。 
2xx: 成功—表示请求已经被成功接收、理解、接受。 
3xx: 重定向—要完成请求必须进行更进一步的操作。 
4xx: 客户端错误—请求有语法错误或请求无法实现。 
5xx: 服务器端错误—服务器未能实现合法的请求。
  • 状态描述:状态描述给出了关于状态代码的简短的文字描述。(上面的OK)

(2)响应头:

Server:Apache Tomcat/5.0.12
Date:Mon,6Oct2003 13:13:33 GMT
Content-Type:text/html
Last-Moified:Mon,6 Oct 2003 13:23:42 GMT
Content-Length:112

 

(3)响应正文

服务器返回的html界面:

<html>
    <head>
    <title>HTTP响应示例<title>
    </head>
    <body>
        Hello HTTP!
    </body>
</html>

 

3.浏览器缓存

缓存包括html缓存和图片js,css等资源的缓存。浏览器缓存是把页面信息保存到用户本地硬盘里

缓存的优点

  1. 服务器响应更快:请求从缓存服务器(而不是源服务器)获取,耗时更少,让服务器看上去响应更快;
  2. 减少网络带宽消耗:当副本被重用时会降低客户端的带宽消耗;

缓存工作原理:

页面缓存状态由http header决定。主要包括Pragma: no-cache、Cache-Control、 Expires、 Last-Modified、If-Modified-Since。

原理主要分为以下三步:

  1. 第一次请求:浏览器通过http的header报头,附带Expires,Cache-Control,Last-Modified/Etag向服务器请求,此时服务器记录第一次请求的Last-Modified/Etag
  2. 再次请求:当浏览器再次请求的时候,请求头附带Expires,Cache-Control,If-Modified-Since/Etag向服务器请求
  3. 服务器根据第一次记录的Last-Modified/Etag和再次请求的If-Modified-Since/Etag做对比,判断是否需要更新,服务器通过这两个头判断本地资源未发生变化,客 户端不需要重新下载,返回304响应

 

关于图片,css,js,flash的缓存

这个主要通过服务器的配置来实现这个技术,如果使用apache服务器的话,可以使用mod_expires模块来实现。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务