Http请求和响应
Http请求和响应
Http协议对浏览器发出的Request格式以及对Web服务器发出的Response格式有具体的规定。
请求部分由三部分组成:
- Requset line:请求行,位于第一行
- Request headers:请求消息头,从第二行开始至第一个空行结束
- Request body:请求正文,从第一个空行之后的都是正文
响应部分也由三部分组成:
- Response line:响应行,位于第一行
- Response headers:响应消息头,从第二行开始至第一个空行结束
- Response body:响应正文,从第一个空行之后的都是正文
请求行和响应行更像是一篇文章的一个摘要
请求头和响应头就像是一篇文章核心内容的一个说明
请求体和响应体就像是一篇文章的核心内容
一、Http请求
Http请求具体格式如下:
Method Path-to-resource Http/Version-number |
User-agent 浏览器的类型 Accept 浏览器接受的MIME类型 Accept language 用户选择的接受语言 Accept-charset 用户首选的编码字符集 …… |
空行 |
Option Request Body |
①请求行:
1.Method为请求方式,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、TRACE,常用的是GET和POST
GET的特点:默认的请求方式。
当请求的资源路径为/SdustExam/Login.jsp?username=admin&password=123456时,GET方式会把表单的请求的数据放在请求的URI的后面,?username=admin&password=123456,这样会暴露数据,而且请求行长度有限。
POST的特点(经常使用的):借助HTML中的form表单。<form action="Login.jsp" method="post">请求参数出现在正文部分,长度木有限制,相对安全。
2.Path-to-resource :请求的资源的URI。例如/SdustExam/Login.jsp
3.Http/Version-number:客户端使用的协议的版本,有HTTP/1.0和HTTP/1.1。
HTTP/1.0:特点:每次请求服务器上的资源都要建立新的连接,响应完毕后都会关闭连接。是无状态的协议。
HTTP/1.1:特点:在一次TCP/IP连接的基础上可以发出多次请求和得到多次的响应。比1.0多了一些请求和响应头。
②请求消息头
向服务器传递附加信息
Accept:通知服务器,浏览器可以接受的MIME类型。(文件系统中用文件扩展名区分数据的类型。网络上用MIME类型来区分数据类型。Tomcat\conf\web.xml)
MIME类型名称:大类型/小类型 如text/html、text/css等等
Accept-Charset:通知服务器,浏览器支持的字符集,如gbk,utf-8
Accept-Encoding:通知服务器,浏览器能够解码的数据压缩方式。比如:gzip
Accept-language:通知服务器,所希望的语言
Host:请求的主机和端口
Referer:是一个URL地址。取值是当前页面之前的那个页面地址的。防盗链用
Content-Type:通知服务器,请求正文的MIME类型。取值:application/x-www-form-urlencoded默认值,对应的是form表单的enctype属性
If-Modified-Since:通知服务器,缓存的文件的最后修改时间。
User-Agent:通知服务器,浏览器类型.
Content-Length:表示请求消息正文的长度
Connection:表示是否需要持久连接。如果服务器看到这里的值为“Keep -Alive”,或者看到请求使用的是HTTP 1.1(HTTP 1.1默认进行持久连接 )
Cookie:这是最重要的请求头信息之一(会话有关)
请求实例:
HTTP请求
HTTP请求的格式如下所示:
<request-line>
<headers>
<blank line>
[<request-body>]
在HTTP 请求中,第一行必须是一个请求行(request line),用来说明请求类型、要访问的资源以及使用的HTTP版本。紧接着是一个首部(header)小节,用来说明服务器要使用的附加信息。在首部之后是一个空行,再此之后可以添加任意的其他数据[称之为主体(body)]。
在HTTP中,定义了大量的请求类型,不过Ajax开发人员关心的只有GET请求和POST 请求。只要在Web浏览器上输入一个URL,浏览器就将基于该URL向服务器发送一个GET请求,以告诉服务器获取并返回什么资源。
对于 www.wrox.com的GET请求如下所示:
GET / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
请求行的第一部分说明了该请求是GET请求。该行的第二部分是一个斜杠(/),用来说明请求的是该域名的根目录。该行的最后一部分说明使用的是HTTP 1.1版本(另一个可选项是1.0)。那么请求发到哪里去呢?这就是第二行的内容。
第2 行是请求的第一个首部,HOST。首部HOST将指出请求的目的地。结合HOST和上一行中的斜杠(/),可以通知服务器请求的是 www.wrox.com/(HTTP 1.1才需要使用首部HOST,而原来的1.0版本则不需要使用)。第三行中包含的是首部User-Agent,服务器端和客户端脚本都能够访问它,它是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义(在本例中是Firefox 1.0.1),并且在每个请求中将自动发送。最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(当然也可以设置为其他值,但这已经超出了本书讨论的范围)。注意,在最后一个首部之后有一个空行。即使不存在请求主体,这个空行也是必需的。
如果要获取一个诸如http://www.wrox.com/books的www.wrox.com域内的页面,那么该请求可能类似于:
GET /books/ HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意只有第一行的内容发生了变化,它只包含URL中www.wrox.com后面的部分。
要发送GET请求的参数,则必须将这些额外的信息附在URL本身的后面。其格式类似于:
URL ? name1=value1&name2=value2&..&nameN=valueN
该信息称之为查询字符串(query string),它将会复制在HTTP请求的请求行中,如下所示:
GET /books/?name=Professional%20Ajax HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive
注意,为了将文本“Professional Ajax”作为URL的参数,需要编码处理其内容,将空格替换成%20,这称为URL编码(URL encoding),常用于HTTP的许多地方(JavaScript提供了内建的函数来处理URL编码和解码,这些将在本章中的后续部分中说明)。“名称—值”(name—value)对用 & 隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。
浏览器发送的首部,通常比本文中所讨论的要多得多。为了简单起见,这里的例子尽可能简短。
另一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线表单并提交它时,这些填入的数据将以POST请求的方式发送给服务器。
以下就是一个典型的POST请求:
POST / HTTP/1.1
Host: www.wrox.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.7.6)
Gecko/20050225 Firefox/1.0.1
Content-Type: application/x-www-form-urlencoded
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
从上面可以发现, POST请求和GET请求之间有一些区别。首先,请求行开始处的GET改为了POST,以表示不同的请求类型。你会发现首部Host和User- Agent仍然存在,在后面有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/ x-www-form- urlencoded的格式编码来传送数据,这是针对简单URL编码的MIME类型。首部Content-Length说明了请求主体的字节数。在首部 Connection后是一个空行,再后面就是请求主体。与大多数浏览器的POST请求一样,这是以简单的“名称—值”对的形式给出的,其中name是 Professional Ajax,publisher是Wiley。你可以以同样的格式来组织URL的查询字符串参数。
正如前面所提到的,还有其他的HTTP请求类型,它们遵从的基本格式与GET请求和POST请求相同。下一步我们来看看服务器将对HTTP请求发送什么响应。
二、http响应
http响应具体格式如下:
Http/Version-number Statuscode message |
Server 服务器的类型信息 Content-type 响应的MIME类型信息 Content-length 被包含在相应类型中的字符数量 …… |
空行 |
Option Response Body |
①响应行:
Http/Version-number:服务器用的协议版本
Statuscode:响应码。代表服务器处理的结果的一种表示,常用的响应码有:
200:正常
302/307:重定向
304:服务器的资源没有被修改
404:请求的资源不存在
500:服务器报错了
message:响应码描述。例如200的描述为OK
②响应消息头:
Location:通知客户端,指示新的资源的位置(结合302/307来用。请求重定向)
Server:通知客户端,服务器的类型
Content-Encoding:通知客户端,响应正文的压缩编码方式。常用的是gzip。
Content-Length:通知客户端响应正文的数据大小
Content-Type:通知客户端响应正文的MIME类型
Refresh:让浏览器自动刷新。取值为整数(刷新的时间间隔,单位是秒)
Refresh:3
Refresh:3;URL=其他资源的URI
Content-Disposition:通知客户端,以下载的方式打开资源。
Content-Disposition:attachment;filename=1.jpg
Set-Cookie:SS=Q0=5Lb_nQ; path=/search服务器端发送的Cookie(会话有关)
Expires: -1 网页的有效时间。单位是毫秒,-1为通知客户端不要缓存
Cache-Control: no-cache (1.1) 通知客户端不要缓存
Pragma: no-cache (1.0) 通知客户端不要缓存
响应实例:
HTTP响应
如下所示,HTTP响应的格式与请求的格式十分类似:
<status-line>
<headers>
<blank line>
[<response-body>]
正如你所见,在响应中唯一真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求的资源情况。以下就是一个HTTP响应的例子:
HTTP/1.1 200 OK
Date: Sat, 31 Dec 2005 23:59:59 GMT
Content-Type: text/html;charset=ISO-8859-1
Content-Length: 122
<html>
<head>
<title>Wrox Homepage</title>
</head>
<body>
<!-- body goes here -->
</body>
</html>
在本例中,状态行给出的HTTP状态代码是200,以及消息OK。状态行始终包含的是状态码和相应的简短消息,以避免混乱。最常用的状态码有:
◆200 (OK): 找到了该资源,并且一切正常。
◆304 (NOT MODIFIED): 该资源在上次请求之后没有任何修改。这通常用于浏览器的缓存机制。
◆401 (UNAUTHORIZED): 客户端无权访问该资源。这通常会使得浏览器要求用户输入用户名和密码,以登录到服务器。
◆403 (FORBIDDEN): 客户端未能获得授权。这通常是在401之后输入了不正确的用户名或密码。
◆404 (NOT FOUND): 在指定的位置不存在所申请的资源。
在状态行之后是一些首部。通常,服务器会返回一个名为Data的首部,用来说明响应生成的日期和时间(服务器通常还会返回一些关于其自身的信息,尽管并非是必需的)。接下来的两个首部大家应该熟悉,就是与POST请求中一样的Content-Type和Content-Length。在本例中,首部 Content-Type指定了MIME类型HTML(text/html),其编码类型是ISO-8859-1(这是针对美国英语资源的编码标准)。响应主体所包含的就是所请求资源的HTML源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。
注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。