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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢! 上一篇:Java网络编程从入门到精通(20):HTTP协议简介    当用户在浏览器中输入一个基于HTTP协议的URL时(以http://开头的URL),就相当于通知器按着这个URL组织生成一个HTTP请求,并交过个请求发送到服务器;同时,等待服务器的响应。

本文为原创,如需转载,请注明作者和出处,谢谢!

上一篇:Java网络编程从入门到精通(20):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中的字母必须大写,请求方法后面的路径大小写都可。消息头字段对大小写不敏感,但大多数的请求和响应字段名都采取了首字母大写的方式。

下一篇:
Java网络编程从入门到精通(22):实现HTTP模拟器



国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

目录
相关文章
|
1月前
|
XML Java 数据库连接
谈谈Java反射:从入门到实践,再到原理
谈谈Java反射:从入门到实践,再到原理
60 0
|
6天前
|
网络协议 Java API
深度剖析:Java网络编程中的TCP/IP与HTTP协议实践
【4月更文挑战第17天】Java网络编程重在TCP/IP和HTTP协议的应用。TCP提供可靠数据传输,通过Socket和ServerSocket实现;HTTP用于Web服务,常借助HttpURLConnection或Apache HttpClient。两者结合,构成网络服务基础。Java有多种高级API和框架(如Netty、Spring Boot)简化开发,助力高效、高并发的网络通信。
|
24天前
|
关系型数据库 Java 开发工具
Java入门高频考查基础知识9(15问万字参考答案)
本文探讨了Spring Cloud的工作原理,包括注册中心的心跳机制、服务发现机制,以及Eureka默认的负载均衡策略。同时,概述了Spring Boot中常用的注解及其实现方式,并深入讨论了Spring事务的注解、回滚条件、传播性和隔离级别。文章还介绍了MySQL的存储引擎及其区别,特别关注了InnoDB如何实现MySQL的事务处理。此外,本文还详细探讨了MySQL索引,包括B+树的原理和设计索引的方法。最后,比较了Git和SVN的区别,并介绍了Git命令的底层原理及流程。
32 0
Java入门高频考查基础知识9(15问万字参考答案)
|
24天前
|
存储 缓存 算法
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
最重要的是保持自信和冷静。提前准备,并对自己的知识和经验有自信,这样您就能在面试中展现出最佳的表现。祝您面试顺利!Java 是一种广泛使用的面向对象编程语言,在软件开发领域有着重要的地位。Java 提供了丰富的库和强大的特性,适用于多种应用场景,包括企业应用、移动应用、嵌入式系统等。下是几个面试技巧:复习核心概念、熟悉常见问题、编码实践、项目经验准备、注意优缺点、积极参与互动、准备好问题问对方和知其所以然等,多准备最好轻松能举一反三。
49 0
Java入门高频考查基础知识4(字节跳动面试题18题2.5万字参考答案)
|
24天前
|
存储 算法 JavaScript
Java入门高频考查算法逻辑基础知识3-编程篇(超详细18题1.8万字参考编程实现)
解决这类问题时,建议采取下面的步骤: 理解数学原理:确保你懂得基本的数学公式和法则,这对于制定解决方案至关重要。 优化算法:了解时间复杂度和空间复杂度,并寻找优化的机会。特别注意避免不必要的重复计算。 代码实践:多编写实践代码,并确保你的代码是高效、清晰且稳健的。 错误检查和测试:要为你的代码编写测试案例,测试标准的、边缘情况以及异常输入。 进行复杂问题简化:面对复杂的问题时,先尝试简化问题,然后逐步分析和解决。 沟通和解释:在编写代码的时候清晰地沟通你的思路,不仅要写出正确的代码,还要能向面试官解释你的
33 0
|
24天前
|
存储 Java 编译器
Java入门高频考查基础知识2(超详细28题2.5万字答案)
多态是面向对象编程中的一个重要概念,它允许不同类的对象对同一消息作出不同的响应。在具体实现上,多态允许一个父类的引用指向其子类的对象,并根据实际指向的对象的类型来调用相应的方法。在 Java 中,多态可以通过以下几种方式实现:在同一个类中,方法名相同,但形参列表不同,实现了多态。子类可以重写(覆盖)其父类的方法,实现多态。在父类引用中调用该方法时,根据实际指向的子类对象的类型来调用相应的方法实现。
39 0
|
25天前
|
编解码 算法 安全
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
【Java技术专题】「入门到精通系列」深入探索Java技术中常用到的六种加密技术和实现
44 0
|
1月前
|
网络协议 网络安全 API
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
Qt 网络编程之美:探索 URL、HTTP、服务发现与请求响应
45 1
|
1月前
|
算法 Java
Java必刷入门递归题×5(内附详细递归解析图)
Java必刷入门递归题×5(内附详细递归解析图)
21 1
|
1月前
|
Java
Java入门必刷的基础题1(八道)
Java入门必刷的基础题1(八道)
20 0