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月前
|
JSON Java Apache
非常实用的Http应用框架,杜绝Java Http 接口对接繁琐编程
UniHttp 是一个声明式的 HTTP 接口对接框架,帮助开发者快速对接第三方 HTTP 接口。通过 @HttpApi 注解定义接口,使用 @GetHttpInterface 和 @PostHttpInterface 等注解配置请求方法和参数。支持自定义代理逻辑、全局请求参数、错误处理和连接池配置,提高代码的内聚性和可读性。
132 3
|
16天前
|
JSON Java 数据格式
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
67 25
java操作http请求针对不同提交方式(application/json和application/x-www-form-urlencoded)
|
20天前
|
Java 开发者 微服务
Spring Boot 入门:简化 Java Web 开发的强大工具
Spring Boot 是一个开源的 Java 基础框架,用于创建独立、生产级别的基于Spring框架的应用程序。它旨在简化Spring应用的初始搭建以及开发过程。
38 6
Spring Boot 入门:简化 Java Web 开发的强大工具
|
16天前
|
监控 架构师 Java
Java虚拟机调优的艺术:从入门到精通####
本文作为一篇深入浅出的技术指南,旨在为Java开发者揭示JVM调优的神秘面纱,通过剖析其背后的原理、分享实战经验与最佳实践,引领读者踏上从调优新手到高手的进阶之路。不同于传统的摘要概述,本文将以一场虚拟的对话形式,模拟一位经验丰富的架构师向初学者传授JVM调优的心法,激发学习兴趣,同时概括性地介绍文章将探讨的核心议题——性能监控、垃圾回收优化、内存管理及常见问题解决策略。 ####
|
1月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
43 13
|
1月前
|
监控 安全 Java
Java中的多线程编程:从入门到实践####
本文将深入浅出地探讨Java多线程编程的核心概念、应用场景及实践技巧。不同于传统的摘要形式,本文将以一个简短的代码示例作为开篇,直接展示多线程的魅力,随后再详细解析其背后的原理与实现方式,旨在帮助读者快速理解并掌握Java多线程编程的基本技能。 ```java // 简单的多线程示例:创建两个线程,分别打印不同的消息 public class SimpleMultithreading { public static void main(String[] args) { Thread thread1 = new Thread(() -> System.out.prin
|
1月前
|
Java 大数据 API
14天Java基础学习——第1天:Java入门和环境搭建
本文介绍了Java的基础知识,包括Java的简介、历史和应用领域。详细讲解了如何安装JDK并配置环境变量,以及如何使用IntelliJ IDEA创建和运行Java项目。通过示例代码“HelloWorld.java”,展示了从编写到运行的全过程。适合初学者快速入门Java编程。
|
1月前
|
安全 Java 调度
Java中的多线程编程入门
【10月更文挑战第29天】在Java的世界中,多线程就像是一场精心编排的交响乐。每个线程都是乐团中的一个乐手,他们各自演奏着自己的部分,却又和谐地共同完成整场演出。本文将带你走进Java多线程的世界,让你从零基础到能够编写基本的多线程程序。
36 1
|
24天前
|
Java
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
Java将OffsetDateTime格式化为 yyyy-MM-dd HH:mm:ss 如何写代码?
27 0
|
29天前
|
Java 程序员 数据库连接
Java中的异常处理:从入门到精通
在Java编程的海洋中,异常处理是一艘不可或缺的救生艇。它不仅保护你的代码免受错误数据的侵袭,还能确保用户体验的平稳航行。本文将带你领略异常处理的风浪,让你学会如何在Java中捕捉、处理和预防异常,从而成为一名真正的Java航海家。

热门文章

最新文章

下一篇
DataWorks