HTTP简单理解
自己最近正在看 《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¶m2=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简单理解的更多相关文章
- git的简单理解及基础操作命令
前端小白一枚,最近开始使用git,于是花了2天看了廖雪峰的git教程(偏实践,对于学习git的基础操作很有帮助哦),也在看<git版本控制管理>这本书(偏理论,内容完善,很不错),针对所学 ...
- 简单理解Struts2中拦截器与过滤器的区别及执行顺序
简单理解Struts2中拦截器与过滤器的区别及执行顺序 当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标 ...
- [转]简单理解Socket
简单理解Socket 转自 http://www.cnblogs.com/dolphinX/p/3460545.html 题外话 前几天和朋友聊天,朋友问我怎么最近不写博客了,一个是因为最近在忙着公 ...
- Js 职责链模式 简单理解
js 职责链模式 的简单理解.大叔的代码太高深了,不好理解. function Handler(s) { this.successor = s || null; this.handle = funct ...
- Deep learning:四十六(DropConnect简单理解)
和maxout(maxout简单理解)一样,DropConnect也是在ICML2013上发表的,同样也是为了提高Deep Network的泛化能力的,两者都号称是对Dropout(Dropout简单 ...
- Deep learning:四十二(Denoise Autoencoder简单理解)
前言: 当采用无监督的方法分层预训练深度网络的权值时,为了学习到较鲁棒的特征,可以在网络的可视层(即数据的输入层)引入随机噪声,这种方法称为Denoise Autoencoder(简称dAE),由Be ...
- 简单理解dropout
dropout是CNN(卷积神经网络)中的一个trick,能防止过拟合. 关于dropout的详细内容,还是看论文原文好了: Hinton, G. E., et al. (2012). "I ...
- 我们为之奋斗过的C#-----C#的一个简单理解
我们首先来简单叙述一下什么是.NET,以及C#的一个简单理解和他们俩的一个区别. 1 .NET概述 .NET是Microsoft.NET的简称,是基于Windows平台的一种技术.它包含了能在.NET ...
- 简单理解ECMAScript2015中的箭头函数新特性
箭头函数(Arrow functions),是ECMAScript2015中新加的特性,它的产生,主要有以下两个原因:一是使得函数表达式(匿名函数)有更简洁的语法,二是它拥有词法作用域的this值,也 ...
- 简单理解JavaScript闭包
很多关于JS的书籍例如<JavaScript权威指南>或者<高程>都把闭包解释的晦涩难懂,萌新们是怎么也看不懂啊!不过别怕,今天我就用很简单的方式给大家讲解下到底什么是闭包.这 ...
随机推荐
- C#关于窗体的keysdown事件,无法获取到焦点
当窗体中包含button之类的控件时,按下方向键时它们会自动获取焦点,导致窗体keysdown事件无法执行.解决方法很简单.将按钮之类控件放到panel容器中控件就无法获取焦点了.这时焦点会在整个窗体 ...
- python中xrange与range的异同
转载自:http://ciniao.me/article.php?id=17 >>> range(5) [0, 1, 2, 3, 4] >>> range(1, 5 ...
- CP30,DBCP数据源配置
Spring中 CP30数据源配置 <!-- 加载属性文件 01--> <bean id= "propertyConfigurer" class="or ...
- 【HDOJ】1818 It's not a Bug, It's a Feature!
状态压缩+优先级bfs. /* 1818 */ #include <iostream> #include <queue> #include <cstdio> #in ...
- poj1980
首先想到费用流,但m<=100000还是算了吧那就感觉要用dp了,首先将a,b排序贪心一下可知,a,b的配对肯定不可能出现交叉这样就可以dp了,复杂度O(nm)还是过不去在贪心一下会发现,对于a ...
- 查错 CH Round #57 - Story of the OI Class
题目:http://ch.ezoj.tk/contest/CH%20Round%20%2357%20-%20Story%20of%20the%20OI%20Class/查错 题解:刚开始看见立马以为是 ...
- 【转】ConcurrentModificationException异常解决办法 --不错
原文网址:http://blog.sina.com.cn/s/blog_465bcfba01000ds7.html 1月30日java.util.ConcurrentModificationExcep ...
- Dinic 模板
#include <iostream> #include <cstring> #include <cstdio> #include <queue> us ...
- CTE Recursion Performance
CTE全名是Common Table Expression,语法基础请参考MSDN文档:https://msdn.microsoft.com/zh-cn/library/ms175972.aspx. ...
- TXT四则运算计算器
基本思想:使用getline函数从TXT文件中依次读出中缀表达式,将其转为后缀表达式后计算结果,并与用户结果比对. 整数.分数.小数的处理:将小数和整数都视为默认分母为1的分数.建立分数类,在中缀转换 ...