Java网络编程从入门到精通(21):HTTP消息的格式

当用户在浏览器中输入一个基于HTTP协议的URL时(以http://开头的URL),就相当于通知器按着这个URL组织生成一个HTTP请求,并交过个请求发送到服务器;同时,等待服务器的响应。无论是请求还是响应,都统称为HTTP消息。

HTTP协议分为两部分:

1. HTTP请求消息。

2. HTTP响应消息。

一、HTTP请求消息

HTTP请求消息分为请求消息头以及请求实体内容两部分。请求消息头的第一行必须由以下三部分组成:

请求的方法(GET、POST和HEAD等)。

Web资源的路径(http://www.website.com/test/test.html中的/test/test.html部分)。

HTTP协议的版本(HTTP/1.0或HTTP/1.1)。

在请求消息头的其他行是请求头字段。每一行的格式是:

"头字段" ":" "头字段的值"

请求头以一个空行结束。如下面上一个GET请求的例子:

GET / HTTP/1.1 Host: www.csdn.net Connection: Keep-Alive Accept: */*

如果是POST请求,将要提交的实体内容放到消息头的空行后面,如下面是一个POST请求的例子:

POST /servlets-examples/servlet/RequestParamExample HTTP/1.1 Host: localhost:8888 Content-Length: 29 Connection: Close
firstname=Bill&lastname=Gates

在上面的请求消息中Content-Length表示请求内容的以字节为单位的长度(" firstname=Bill&lastname=Gates"的长度)。在使用POST方法时,这个字段必须提供,而且长度必须等于实体内容的长度,否则服务器将返回一个错误状态码。

二、HTTP响应消息

HTTP响应消息同样也分为消息头和实体内容两部分。HTTP的响应消息头和请求消息头类似;第一行是请求的结果,也就是说,在响应消息头的第一行表明了请求消息是否成功地获得了服务器上的Web资源。第一行必须由以下三部分组成:

1.       响应消息的HTTP版本。

格式为HTTP/1.1或HTTP/1.0。这个版本号未必和请求消息头的版本号一致;这主要是

因为,服务器未必支持HTTP请求中所描述的HTTP版本,如使用GET / HTTP/1.1去请求服务器,当服务器只支持HTTP1.0时,那么就会返回HTTP/1.0。

2.       状态码。

这个状态码由三位的数字组成,分为五个档次。下面是HTTP1.1的响应码:

(1)以1开头的数字(1xx)。

临时请求状态码。由100和101组成。这类状态码并不经常使用,它们的作为主要是服务器为客户端返回的临时的状态。

(2)以2开头的数字(2xx)。

请求成功状态码。范围从200到206。其中最常用的是200,它表示客户端请求成功,服务器已经将所请求的Web资源返回到了客户端。其他的六个状态码类似,都表示请求成功,只是要指引客户端进和下一步的动作。如状态码206表示服务器只是返回了一部分请求资源,客户端要想获得全部的Web资源,必须继续发出HTTP请求。其他的响应码的含义可以参阅HTTP1.1的规范RFC2616。

(3)以3开头的数字(3xx)。

Web资源重定向状态码。范围从300到307。所有以3开头的状态码都以不同的原因和方式使Web资源改变了原来的URL。如302通过一个Location字段确定了Web资源改变URL后的位置。有了这种状态码,当某个网站或其他的Web资源的URL变化后,而访问这些Web资源的用户并不能即使知道变化后的URL;因此,可以在用户访问原来的URL时加一个302响应,使客户端自动去访问新的URL。

(4)以4开头的数字(4xx)。

客户端错误状态码。范围从400到417。也许没人希望看到这状态码。但它们确实在Internet上大量存在。当用户访问的Web资源不存在或是没有权限访问Web资源时,服务器将返回这类状态码。这类状态码中最常遇到的是400。当用户发送一个不存在的Web资源路径时(GET、POST和HEAD方法后面跟的路径),服务器就会返回这个状态码。

(5)以5开头的数字(5xx)。

服务器错误状态码。范围从500到505。这类状态码也是一类错误状态码,只是它和4xx不同的是,5xx的错误是由于服务器的原因而产生的;如用户向服务器发送一个HTTP协议不支持的方法,如GET1,服务器将返回501错误,表示服务器不支持这个HTTP请求方法。

3.     状态信息。

响应信息的内容和状态码息息相关。如状态码为200,则状态信息为"OK"。状态码为501,状态信息为"Not Implemented"。要想详细了解每一个状态码所对应的状态信息,请参阅HTTP1.1的规范RFC2616。

HTTP响应消息的其他部分和请求消息一样,也是由很多响应头字段组成,每个字段和字段值占一行。响应消息头使用一个空行结束,空行的后面跟着HTTP响应消息的实体内容。如下面是一个完整的HTTP请求和响应的例子:

HTTP请求消息

GET / HTTP/1.1 Host:www.csdn.net

HTTP响应消息

HTTP/1.0 200 OK Content-Length: 132273 Content-Type: text/html Content-Location: http://www.csdn.net/index.htm Last-Modified: Sun, 28 Jan 2007 09:20:00 GMT Accept-Ranges: bytes ETag: "eed72b7cbd42c71:1b0e" Server: Microsoft-IIS/6.0 X-Powered-By: ASP.NET Date: Sun, 28 Jan 2007 09:23:26 GMT Age: 32 X-Cache: HIT from cachebj244.csdn.net Connection: close <!DOCTYPE html 
 

从上面的HTTP消息可以看出,请求和响应消息中的HTTP版本并不一样,这说明CSDN的Web服务器为了和只支持HTTP1.0的客户端兼容,也采用了HTTP1.0协议。 
注意:在HTTP请求和响应消息中的第一行的请求方法(GET、POST等)以及HTTP/1.1或HTTP1.0中的字母必须大写,请求方法后面的路径大小写都可。消息头字段对大小写不敏感,但大多数的请求和响应字段名都采取了首字母大写的方式。

时间: 2024-10-12 18:04:38

Java网络编程从入门到精通(21):HTTP消息的格式的相关文章

Java网络编程从入门到精通(4):DNS缓存

在通过DNS查找域名的过程中,可能会经过多台中间DNS服务器才能找到指定的域名,因此,在DNS服务器上查找域名是非常昂贵的操作.在Java中为了缓解这个问题,提供了DNS缓存.当InetAddress类第一次使用某个域名(如www.csdn.net)创建InetAddress对象后,JVM就会将这个域名和它从DNS上获得的信息(如IP地址)都保存在DNS缓存中.当下一次InetAddress类再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器. DNS缓存在默认时将永

Java网络编程从入门到精通 (9):使用isXxx方法判断地址类型

IP地址分为普通地址和特殊地址.在前面的文章中所使用的大多数都是普通的IP地址,在本文中将介绍如何利用InetAddress类提供的十个方法来确定一个IP地址是否是一个特殊的IP地址. 一.isAnyLocalAddress方法 当IP地址是通配符地址时返回true,否则返回false.这个通配符地址对于拥有多个网络接口(如两块网卡)的计算机非常拥有.使用通配符地址可以允许在服务器主机接受来自任何网络接口的客户端连接.IPv4的通配符地址是0.0.0.0.IPv6的通配符地址是0:0:0:0:0

Java网络编程从入门到精通(18):Socket类的getter和setter方法(2)

二.用于获得和设置Socket选项的getter和setter方法 Socket选择可以指定Socket类发送和接受数据的方式.在JDK1.4中共有8个Socket选择可以设置.这8个选项都定义在java.net.SocketOptions接口中.定义如下: public final static int TCP_NODELAY = 0x0001;    public final static int SO_REUSEADDR = 0x04;    public final static int

Java网络编程从入门到精通(16):客户端套接字(Socket)的超时

客户端套接字的超时(timeout)就是指在客户端通过Socket和服务器进行通讯的过程中,由于网络延迟,网络阻塞等原因,造成服务器并未及时响应客户端的一种现象.在一段时间后,客户端由于未收到服务端的响应而抛出一个超时错误; 其中客户端所等待的时间就是超时时间. 由于生产超时错误的一端都是被动端:也就是说,这一端是在接收数据,而不是发送数据.对于客户端Socket来说,只有两个地方是在接收数据:一个是在连接服务器时;另一个是在连接服务器成功后,接收服务器发过来的数据时.因此,客户端超时也分为两种

Java网络编程从入门到精通(14):多种多样的建立网络连接的方式

在上一篇文章中我们讨论了Socket类的基本用法,并给出的例子中使用Socket类连接服务器时使用了一种最简单的连接方式,也就是通过IP和端口号来连接服务器.而为了使连接服务器的方式更灵活,Socket类不仅可以通过自身的构造方法连接服务器,而且也可以通过connect方法来连接数据库. 一.通过构造方法连接服务器 我们可以通过6个重载构造函数以不同的方式来连接服务器.这6个重载的构造函数可以分为两类: 1. 自动选择IP     这种方式是最常用的.所谓自动选择IP,是指当本机有多块网卡或者在

Java网络编程从入门到精通(13):使用Socket类接收和发送数据

网络应用分为客户端和服务端两部分,而Socket类是负责处理客户端通信的Java类.通过这个类可以连接到指定IP或域名的服务器上,并且可以和服务器互相发送和接受数据.在本文及后面的数篇文章中将详细讨论Socket类的使用,内容包括Socket类基础.各式各样的连接方式.get和set方法.连接过程中的超时以及关闭网络连接等. 在本文中,我们将讨论使用Socket类的基本步骤和方法.一般网络客户端程序在连接服务程序时要进行以下三步操作. 1.         连接服务器 2.         发送

Java网络编程从入门到精通(8):用getAddress方法获得IP地址

getAddress方法和getHostAddress类似,它们的唯一区别是getHostAddress方法返回的是字符串形式的IP地址,而getAddress方法返回的是byte数组形式的IP地址.getAddress方法的定义如下: public byte[] getAddress() 这个方法返回的byte数组是有符号的.在Java中byte类型的取值范围是-128?127.如果返回的IP地址的某个字节是大于127的整数,在byte数组中就是负数.由于Java中没有无符号byte类型,因此

Java网络编程从入门到精通(7):用getHostAddress方法获得IP地址

 这个方法用来得到主机的IP地址,这个IP地址可能是IPv4的地址,也可能是IPv6的地址.getHostAddress方法的定义如下: public String getHostAddress() 无论InetAddress对象是使用哪种方式创建的,getHostAddress方法都不会访问DNS服务器.如果想访问使用IPv6地址的远程主机,需要在操作系统上安装IPv6协议.下面是Windows 2003上安装IPv6协议的步骤: 第一步:打开“本地连接”属性对话框.如图1所示. 图1 “本地

Java网络编程从入门到精通(5):使用InetAddress类的getHostName方法获得域名

该方法可以得到远程主机的域名,也可以得到本机名.getHostName方法的定义如下: public String getHostName() 下面是三种创建InetAddress对象的方式,在这三种方式中,getHostName返回的值是不同的. 1.使用getLocalHost方法创建InetAddress对象 如果InetAddress对象是用getLocalHost方法创建的,getHostName返回的是本机名.如下面的代码所示: InetAddress address = InetA