对于HTTP请求头及响应头的详解

对于HTTP协议的请求头的详解

标签: CSDN博文


http协议由两部分组成:请求和响应。当你在浏览器中输入一个URL时,浏览器将按照你的请求创建并且发送请求,该请求包含的所输入的URL以及一些与浏览器相关的信息。当服务器收到这个请求时将返回一个响应,该响应包括与该请求相关的信息以及位于指定URL(如果有的话)数据。知道浏览器解析该响应并显示出网页(或其他资源)为止。

HTTP请求

http请求的格式如下所示:
<request-line>
<headers>
<blank line>
[<request-body>]

  • request line

在http请求中,第一行必须是一个请求行(request line),用来说明请求类型、URL以及使用的HTTP协议的版本。

  • 列表项

紧接着是一个首部(headers)小结说明服务器要使用的附加信息。

  • 空行
  • 主体(body)

添加其他任意数据的主体

在GTTP中,定义了很多请求类型,通常我们关心的只有GET、POST请求。只要在Web浏览器上输入一个URL浏览器就将基于该URL向服务器发送一个GET请求,告诉服务器获取并且返回什么资源。对于www.baidu.com的GET请求如下:
GET/ HTTP/1.1
Host: www.baidu.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请求。该行的第二部分是一个斜杠(/),用来说明请求是该域名的根目录。最后一部分说明使用的是1.1版本的HTTP协议。

第二行是请求的第一个首部HOST。首部HOST将指出请求的目的地。结合上一行的(/),可以通知服务器访问的是www.baidu.com/.

第三行包含的是首部User—Agent,服务器端和客户端脚本都能访问它,是浏览器类型检测逻辑的重要基础。该信息由你使用的浏览器来定义,并且在每个请求中都会自动发送。

最后一行是首部Connection,通常将浏览器操作设置为Keep-Alive(需要研究)(当然也有其他值)。注意,在最后一行首部之后有一个空行。即不存在请求主体,这个空行也是必须的。
要发送GET请求的参数,则要将这些额外的信息附在URL本身的后面。
EX:URL?name1=value1&name2=value2
该信息陈志伟查询字符串(query String),它将会复制在HTTP请求的请求行中,如下所示:
GET/books/?name=Professional%20Ajax http/1.1
Host: www.baidu.com
User-Agent: 浏览器信息
Gecko/20050225 Firefox/1.0.1
Connection: Keep-Alive

注意,为了将文本“Professional Ajax”作为URL的参数,需要编码处理其内容,将空格替换为%20,这称为URL编码(URL Encoding),常用于Http的许多地方(JS提供了内建的函数来处理URL编码和解码)。“名称-值”(name-value)用&隔开。绝大部分的服务器端技术能够自动对请求主体进行解码,并为这些值的访问提供一些逻辑方式。当然,如何使用这些数据还是由服务器决定的。

另外一方面,POST请求在请求主体中为服务器提供了一些附加的信息。通常,当填写一个在线的表单并提交它的时候,这些填入的数据将以POST请求的方式发送给服务器。
EX:
POST/ http/1.1
host: www.baidu.com
User-Agent: 浏览器及系统信息
Content-Type: application/x-www-form-urlencoded(需要研究)
Content-Length: 40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley

从上面可以发现,Post和Get请求之间有一些区别。
- 首先
请求行开始处的Get和post。
- 其次
有两个新行。其中首部Content-Type说明了请求主体的内容是如何编码的。浏览器始终以application/x-www-form-urlencoded格式编码来传送数据,这是针对简单的URL编码的MIME(了解)类型。
Content-Length说明了请求主体的字节数。
Connection后是一个空行,再后面就是请求主体。与大多数浏览器的Post请求一样,这好似以简单的“名称-值”对的形式给出的,其中name是Professional Ajax,publisher是Wiley。你可以用同样的格式来组织URL的查询字符串参数。

常见的请求头:
Accept:浏览器可接受的MIME类型。
Accept-Charset:浏览器可接受的字符集
Accetp-Encoding:浏览器能够进行编码的数据编码方式,比如gzip。许多情况下gzip的页面可以检索5到10倍的下载时间。
Accept-Language:浏览器所希望的语言种类,当服务器能够提供一种以上的语言本事要用到
Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中
Connection:表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”,或者看到请求使用的是HTTP1.1(HTTP1.1默认进行持久连接),它就可以利用持久连接的优点,当页面包含多个元素时(例如Applet,图片),显著的减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Contetn-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。
Content-Length:表示请求消息正文的长度。
CookieL:这是最重要的请求头信息之一。
From:请求发送者的email地址,由一些特殊Web客户程序使用,浏览器不会用到。
Host:初始URl中的主机和端口
If-Modified-Since:只有当所请求的被人在指定的日期之后又经过修改时才返回它,够则返回304“Not Modifede”应答。
Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即使它是代理服务器而且已经有了本页的本地拷贝。
Referer:包含一个URL,用户从该URL代表的页面发出访问当前页面的请求。
User_agent:浏览器类型,如果Servlet返回的内容与浏览器类型有关。
UA-Pixels,UA-Color,UA_OS,UA-CPU:由某些版本的IE浏览器所发送的非标准请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

HTTP响应

如下所示,Http响应的格式与请求的格式十分类似:
<status-line>
<herders>
<blank line>
[<response-body>]
如你所见,在响应中为i亿真正的区别在于第一行中用状态信息代替了请求信息。状态行(status line)通过提供一个状态码来说明所请求资源的情况。
EX:
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></title>
</head>
<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源文件(尽管还可能包含纯文本或其他资源类型的二进制数据)。浏览器将把这些数据显示给用户。

注意,这里并没有指明针对该响应的请求类型,不过这对于服务器并不重要。客户端知道每种类型的请求将返回什么类型的数据,并决定如何使用这些数据。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值