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

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

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

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

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

解析HTTP协议URL

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

HTTP的URL的一般格式为: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-1、GB2312等

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请求中不能包含实体内容,而使用POST、PUT和DELETE方法的HTTP请求中可以包含实体内容。可以使用简化的HTTP请求和HTTP响应,此时,它们不能包含消息头。

GET方法与POST方法

已经看到,HTTP协议中包含了多种方法,但最常用的是GET和POST方法。注意使用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:表示内部服务器错误,即服务器端的CGI、ASP、JSP等程序发生了错误。

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>

HTTP简单理解的更多相关文章

  1. git的简单理解及基础操作命令

    前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...

  2. 简单理解Struts2中拦截器与过滤器的区别及执行顺序

    简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...

  3. [转]简单理解Socket

    简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html  题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...

  4. Js 职责链模式 简单理解

    js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...

  5. Deep learning:四十六(DropConnect简单理解)

    和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...

  6. Deep learning:四十二(Denoise Autoencoder简单理解)

    前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...

  7. 简单理解dropout

    dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...

  8. 我们为之奋斗过的C#-----C#的一个简单理解

    我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...

  9. 简单理解ECMAScript2015中的箭头函数新特性

    箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...

  10. 简单理解JavaScript闭包

    很多关于JS的书籍例如<JavaScript权威指南>或者<高程>都把闭包解释的晦涩难懂,萌新们是怎么也看不懂啊!不过别怕,今天我就用很简单的方式给大家讲解下到底什么是闭包.这 ...

随机推荐

  1. C#关于窗体的keysdown事件,无法获取到焦点

    当窗体中包含button之类的控件时,按下方向键时它们会自动获取焦点,导致窗体keysdown事件无法执行.解决方法很简单.将按钮之类控件放到panel容器中控件就无法获取焦点了.这时焦点会在整个窗体 ...

  2. python中xrange与range的异同

    转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...

  3. CP30,DBCP数据源配置

    Spring中 CP30数据源配置 <!-- 加载属性文件 01--> <bean id= "propertyConfigurer" class="or ...

  4. 【HDOJ】1818 It's not a Bug, It's a Feature!

    状态压缩+优先级bfs. /* 1818 */ #include <iostream> #include <queue> #include <cstdio> #in ...

  5. poj1980

    首先想到费用流,但m<=100000还是算了吧那就感觉要用dp了,首先将a,b排序贪心一下可知,a,b的配对肯定不可能出现交叉这样就可以dp了,复杂度O(nm)还是过不去在贪心一下会发现,对于a ...

  6. 查错 CH Round #57 - Story of the OI Class

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/查错 题解:刚开始看见立马以为是 ...

  7. 【转】ConcurrentModificationException异常解决办法 --不错

    原文网址:http://blog.sina.com.cn/s/blog_465bcfba01000ds7.html 1月30日java.util.ConcurrentModificationExcep ...

  8. Dinic 模板

    #include <iostream> #include <cstring> #include <cstdio> #include <queue> us ...

  9. CTE Recursion Performance

    CTE全名是Common Table Expression,语法基础请参考MSDN文档:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx. ...

  10. TXT四则运算计算器

    基本思想:使用getline函数从TXT文件中依次读出中缀表达式,将其转为后缀表达式后计算结果,并与用户结果比对. 整数.分数.小数的处理:将小数和整数都视为默认分母为1的分数.建立分数类,在中缀转换 ...