admin 管理员组

文章数量: 887053


2024年1月10日发(作者:动态网页和静态网页的主要区别是什么)

HTTP 请求

一个 HTTP 请求包含三个部分:

Method-URI-Protocol/Version 方法-地址-版本

Request header 请求头

Entity body 请求实体

下面是一个 HTTP 请求实例:

POST /servlet/ HTTP/1.1

Accept: text/plain; text/html

Accept-Language: en-gb

Connection: Keep-Alive

Host: localhost

Referer: localhost/ch8/

User-Agent: Mozilla/4.0 (compatible; MSIE 4.01; Windows 98)

Content-Length: 33

Content-Type: application/x-www-form-urlencoded

Accept-Encoding: gzip, deflate

LastName=Franks&FirstName=Michael

The Method-URI-Protocol/Version 在这个请求的第一行:

POST /servlet/ HTTP/1.1

其中 POST 是请求的类型。每个客户端 HTTP 请求可以是 HTTP 规范中指定的许多请求类型中的一种。HTTP 1.1 支持七种类型的请求,它们是 GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE。其中 GET

与 POST 是 Internet 应用中经常用到的二种请求类型。

URI 完整地指定了 Internet 资源。一个 URI 通常被解析为相对服务器的根目录。这样,它应该总是以一个 '/' 前缀开始。一个 URL 实际上是 URI 的一种类型。

Version 指的是该 HTTP 请求所用到的 HTTP 协议版本。

请求头包含了客户端环境与请求实体的一些有用的信息。例如它包含浏览器设定的语言、实体的长度等等。每条请求头用回车换行符(CRLF)分开。

一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。一些 Internet 开发书籍认为这个 CRLF 空行是 HTTP 请求的第四个部分。

在上面的 HTTP 请求中,实体只是简单以下的一行:

LastName=Franks&FirstName=Michael

在一个典型的 HTTP 请求中,请求实体内容会长得多。

HTTP 响应

与请求相似,HTTP 响应也由三部分组成:

Protocol-Status code-Description 协议状态 描述代码

Response headers 响应头

Entity body 响应实体

以下是一个 HTTP 响应的实例:

HTTP/1.1 200 OK

Server: Microsoft-IIS/4.0

Date: Mon, 3 Jan 1998 13:13:33 GMT

Content-Type: text/html

Last-Modified: Mon, 11 Jan 1998 13:23:42 GMT

Content-Length: 112

HTTP Response Example

Welcome to Brainy Software

响应头的第一行类似请求头的第一行,告诉你所用的协议是 HTTP 1.1 ,请求成功(200=success),以及没有任何问题。

响应头类似请求头也包含了一些有用的信息。响应的实体响应本身的 HTML 内容。头与实体之间由回车换行的空行(CRLF)分开。

最常见的请求头:

Accept:浏览器可接受的MIME类型。

Accept-Charset:浏览器可接受的字符集。

Accept-Encoding:浏览器能够进行解码的数据编码方式,比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。

Accept-Language:浏览器所期望的语言种类,当服务器能够提供一种以上的语言版本时要用到。

Authorization:授权信息,通常出现在对服务器发送的WWW-Authenticate头的应答中。

Connection:表示是否需要持久连接。假如Servlet看到这里的值为“Keep-Alive”,或者看到请求运用的是HTTP 1.1(HTTP 1.1默认进行持久连接),它就可以利用持久连接的长处,当页面包含多个元素时(例如Applet,图片),显着地减少下载所需要的时间。要实现这一点,Servlet需要在应答中发送一个Content-Length头,最简单的实现方法是:先把内容写入ByteArrayOutputStream,然后在正式写出内容之前计算它的大小。

Content-Length:表示请求消息正文的长度。

Cookie:这是最重要的请求头信息之一,参见后面《Cookie处理》一章中的讨论。

From:请求发送者的email地址,由一些非凡的Web客户顺序运用,浏览器不会用到它。

Host:初始URL中的主机和端口。

If-Modified-Since:只有当所请求的内容在指定的日期之后又经过修改才返回它,否则返回304“Not

Modified”应答。

Pragma:指定“no-cache”值表示服务器必须返回一个刷新后的文档,即便它是代理服务器而且已经有了页面的本地拷贝。

Referer:包含一个URL,用户从该URL代表的页面出发访问当前请求的页面。

User-Agent:浏览器类型,假如Servlet返回的内容与浏览器类型有关则该值非常有用。

UA-Pixels,UA-Color,UA-OS,UA-CPU:由某些版本的IE浏览器所发送的非标准的请求头,表示屏幕大小、颜色深度、操作系统和CPU类型。

有关HTTP头完整、具体的阐明,请参见/Protocols/的HTTP规范。

5.2 在Servlet中读取请求头

在Servlet中读取HTTP头是非常方便的,只需要调用一下HttpServletRequest的getHeader方法即可。假如客户请求中提供了指定的头信息,getHeader返回对应的字符串;否则,返回null。部分头信息经常要用到,它们有专用的访问方法:getCookies方法返回Cookie头的内容,经解析后存放在Cookie对象的数组中,请参见后面有关Cookie章节的讨论;getAuthType和getRemoteUser方法分别读取Authorization头中的一部分内容;getDateHeader和getIntHeader方法读取指定的头,然后返回日期值或整数值。

除了读取指定的头之外,利用getHeaderNames还可以得到请求中所有头名字的一个Enumeration对象。

最后,除了查看请求头信息之外,我们还可以从请求主命令行获得一些信息。getMethod方法返回请求方法,请求方法通常是GET或者POST,但也有可能是HEAD、PUT或者DELETE。getRequestURI方法返回URI(URI是URL的从主机和端口之后到表单数据之前的那一部分)。getRequestProtocol返回请求命令的第三部分,一般是“HTTP/1.0”或者“HTTP/1.1”。

5.3 实例:输出所有的请求头

下面的Servlet实例把所有接收到的请求头和它的值以表格的形式输出。另外,该Servlet还会输出主请求命令的三个部分:请求方法,URI,协议/版本。

package hall;

import .*;

import t.*;

import .*;

import .*;

public class ShowRequestHeaders extends HttpServlet {

public void doGet(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

tentType("text/html");

PrintWriter out = ter();

String title = "显示所有请求头";

n(thTitle(title) +

"<BODY BGCOLOR=\"#FDF5E6\">\n" +

"<H1 ALIGN=CENTER>" + title + "</H1>\n" +

"<B>Request Method: </B>" +

hod() + "<BR>\n" +

"<B>Request URI: </B>" +

uestURI() + "<BR>\n" +

"<B>Request Protocol: </B>" +

tocol() + "<BR><BR>\n" +

"<TABLE BORDER=1 ALIGN=CENTER>\n" +

"<TR BGCOLOR=\"#FFAD00\">\n" +

"<TH>Header Name<TH>Header Value");

Enumeration headerNames = derNames();

while(eElements()) {

String headerName = (String)ement();

n("<TR><TD>" + headerName);

n(" <TD>" + der(headerName));

}

n("</TABLE>\n</BODY></HTML>");

}

public void doPost(HttpServletRequest request,

HttpServletResponse response)

throws ServletException, IOException {

doGet(request, response);

}

}


本文标签: 请求 浏览器 返回