HTTP简单理解

自己最近正在看 《Java Web 整合开发实战》这本书, 看到HTTP协议,感觉写的挺明白了,就把书中内容总结了下,记录在此。

 

超文本传输协议(HyperText Transfer Protocol)简称为HTTP,是互联网上应用最广泛的一种网络协议。

它允许将HTML文档从web服务器传送到web浏览器。

HTTP是通用的、无状态的、面向对象的协议。

HTTP的消息分为请求消息和响应消息两种。

 

解析HTTP协议URL

统一资源定位符URL用来标识万维网上的各种资源,它使用抽象的方法来识别资源的位置,并定位资源。URL由三部分组成:协议类型,主机名和路径及文件名。

HTTPURL的一般格式为:http://host[":"port][path]

Port用来指定端口号,默认情况下,HTTP的端口号为80,通常可以忽略;path指定请求资源的路径,由零个或多个"/"符号间隔的字符串组成,表示主机上的一个目录或文件地址,此项可省,URL会指向Internet上的某个主页。

 

解析HTTP协议请求

HTTP协议的请求主要由三部分组成:请求行,请求报头和请求体

 

1.请求行

请求行只包含三个内容:方法(Method)、请求资源的URL(Request-URI)HTTP版本(HTTP-Version)

Method Request-URI HTTP-Version CRLF

其中CRLF表示回车和换行;所谓的“方法”可以理解为操作或命令。HTTP1.1中包含下面:

GET

请求读取由Request-URI标识的资源。此方法的URL参数传递的数量是有限的,一般在1KB以下

POST

请求服务器接收在Request-URI标识的资源后附加新数据。传递参数的数量比GET大的多,一般没有限制

HEAD

请求获取由Request-URI标识的资源的响应消息报头

PUT

请求服务器保存一个资源,使用Request-URI来标识,既可以是新资源也可以是已存在的资源

DELETE

请求服务器删除请求行中Request-URI标识的资源

OPTIONS

请求客户端查询服务器的性能,或者查询与资源相关的选项和需求

TRACE

请求服务器回送收到的请求消息,用来进行测试和诊断

PATCH

PUT相似,但其实体中包含一个表,表中说明与该Request-URI所标识的原资源的内容区别

MOVE

请求服务器将Request-URI标识的资源移动到另一个网络地址

COPY

请求服务器将Request-URI标识的资源复制到另一个网络地址

LINK

请求服务器建立链接关系

UNLINK

断开一个或多个链接关系

WRAPPED

允许客户端发送一个或多个经过封装的请求

Extension

-method

在不改动协议的条件下允许增加一些新方法

 

2.请求报头 

请求报头包含客户端传递请求的附加信息及客户端的自身信息。常用的请求报头有Accept User-Agent

Agent用于指定客户端所接受的信息类型,常有多个Accept行:

Accept:text/html

Accept:image/gif

表明客户端可以接收图像和HTML文件或文本文件

User-Agent用于将发送请求的客户端信息,如客户端的操作系统名称和版本信息、浏览器的名称和版本信息等告知服务器。

其他常用报头如下:

Accept-Charset

指定客户端可以接受的字符集,如果ISO-8859-1GB2312

Accept-Encoding

指定客户端可接受的编码

Accept-Language

指定服务器端可接受的自然语言,如果该域未设置,表示可接受各种语言

Host

指定被请求资源所在的主机和端口号,缺省端口号为80

Connection

指定请求结束后是保持链接(keep-alive)还是关闭链接(close)

 

HTTP请求举例

Get /index.html HTTP/1.1                  //请求行

Accept: text/plain                             //ASCII码文本文件

Accept: text/html                             //HTML文本文件

User-Agent:Mozilla/4.5(WinNT)          //指定用户代理

空行                                                //空行

说明:

  • 上面代码就是一个HTTP请求信息,这个消息是使用ASCII本文写的
  • 请求消息一共包含5行,每行都以一个回车符和一个换行符来结束。特别是最后一行之后还有一个空行,即最后一行后面还跟着一个额外的回车符和换行符
  • 代码中第一行是请求行,后面三行是请求报头,在消息头之后有一个空行
  • HTTP请求说明浏览器使用GET方法请求文档/index.html 浏览器则只允许接受纯ASCII码文件和HTML文本文件
  • User-Agent头部指定用户代理,即产生当前请求的浏览器类型,此处使用的浏览器是Mozilla/4.5

需要注意的是,使用GET方法的HTTP请求中不能包含实体内容,而使用POSTPUTDELETE方法的HTTP请求中可以包含实体内容。可以使用简化的HTTP请求和HTTP响应,此时,它们不能包含消息头。

GET方法与POST方法

已经看到,HTTP协议中包含了多种方法,但最常用的是GETPOST方法。注意使用GET方法和POST方法来传递参数时的不同。

GET方法是最简单的HTTP方法,它的主要任务就是向服务器请求一个资源并把资源发送回来。这个资源可以是一个HTML页面,也可以是一个JPEG图像等。GET方法的关键就是要从服务器获取一些资源。

POST方法不仅可以向服务器请求某个资源,同时还可以向服务器发送一些表单数据。

使用GET方法时在URL地址后面常常可以附加一些参数,例如:Get  http://www.java123.org/servlet?param1=a?param2=b HTTP/1.1

GET方法说明如下:

  • GET方法中对总的字符数是有限制的,这取决于具体的服务器。如果用户在地址栏中键入的文本太长,可能会导致GET方法无法正常工作。
  • GET方法发送的数据会追加到URL后面,而且在浏览器的地址栏中会显示出这些数据,因此一些比较隐私的或敏感的数据不建议使用GET方法来发送。
  • 在使用GET方法中,参数会追加到请求URL后面,且以"?"开头。各个参数之间使用"&"进行分隔。

使用POST方法发送数据的实例如下:

POST /index.html HTTP/1.1                                             //请求行

HOST:www.javait.com                                                     //存放所请求对象的主机

User-Agent:Mozilla/4.5(WinNT)                                    //指定用户代理

Accept:text/html                                                              //HTML文本文件

Accept-language:zh-cn                                                    //指定可接受的语言

Content-Length:22

Connection:keep-alive

Param1=abc&param2=def                                             //提交的参数

上面POST方法将参数放到消息体中,因此不再像GET方法一样收到地址栏中文本太长的限制,而且这些参数并不会直接显示在地址栏上。

使用GET方法传递参数时其数据量是有限的,一般不超过1KB。而使用POST方法其传递的数据量是没有限制的,但是需要将请求报头Content-Type设置为application/x-www.form-urlencoded,Content-Length设置为实体内容的长度。

 

解析HTTP协议响应

在接受到一个请求后,服务器会返回一个HTTP响应。HTTP响应由三部分构成,即:状态行、响应报头和响应正文

1.状态行

状态行由HTTP版本(HTTP-Version)、状态码(Status-Code)、以及解释状态码的简单短语(Reason-phrase)三部分构成,其格式如下:

HTTP-Version Status-Code Reason-phrase CRLF

状态码由三位数字组成,共有5大类33种,其第一个数字指定了响应类别,取值为1~5,后面两位没有具体的规定。

  • 1XX : 指示信息,如请求收到了或正在处理
  • 2XX : 成功
  • 3XX : 重定向
  • 4XX : 客户端错误,如请求中含有错误的语法或不能正常完成
  • 5XX : 服务器端错误,如服务器失效而不能完成请求

例如:

200 OK 成功

304 Not Modified 未修改

400 Bad Request 错误请求

404 Not Found 未找到

典型的响应状态码解释如下:

200 :标识请求成功,成功返回了请求的资源

302/307:表示临时重定向,此时被请求的文档已经临时移动到其他位置,该文档新的URL将在Location响应报头中给出。

401: 表示浏览器访问的是一个收到密码保护的页面

403:表示服务器收到请求,但是拒绝提供服务

404:表示找不到资源,即服务器上不存在浏览器请求的资源

500:表示内部服务器错误,即服务器端的CGIASPJSP等程序发生了错误。

503:表示服务器暂时性超载,不能处理当前的请求

 

2.响应报头

有了响应报头,服务器就可以传递不能放在状态栏中的附加响应信息,服务器信息和对Request-URI所标识资源进行下一步访问的信息。

常见的响应报头如下:

Allow:指出服务器所支持的请求方式,如GET POST

Content-Encoding:指定文档的编码方法

Content-Length:指定响应中数据的字节长度

Content-Type:指定回送数据的MIME类型

Date:指定发送HTTP消息的日期

Last-Modified:指定返回数据的最后修改时间

Location:重定向请求者到一个新的URI地址

Refresh:指定浏览器定时刷新的时间

Expires:指定浏览器缓存数据的时间

Server:指定浏览器的名称,包含了处理请求的服务器使用的软件产品信息,与User-Agent请求报头相对应。

 

3.响应正文

响应正文是指服务器所返回的资源内容,如HTML页面。响应报头和响应正文之间必然使用空行来分隔。

实例:

HTTP/1.1 200 OK                                                                             //状态行

Connection: close                                                                           // 链接状态

Date : Wed, 19 Nov 2011 02:20:45 GMT                                   //日期

Server : Apache/2.0.54(Unix)                     //服务器

Content-Length:397                              //指定数据包含的字节长度

Content-Type: text/html                         //指定返回数据的MIME类型

/*空行*/

<html>

<body>

  数据

</body>

</html>

posted on 2015-11-26 15:39  nice-gh  阅读(443)  评论(0编辑  收藏  举报

导航