HTTP协议的请求和响应都有一定的规则,这篇网站当中首先着重介绍一下HTTP协议的请求协议的内容。
HTTP协议的请求主要由一下几部分组成:请求行,请求头,请求体(post)
请求头1\r\n
请求头1\r\n
...
\r\n
请求体(Post方式)\r\n
我们分别按块来说明一下消息请求的格式。
<-----------------------------------------------华丽的分割线------------------------------------------------------------>
首先来说一下请求行&#xff0c;请求行主要由三部分组成&#xff0c;请求方法&#xff0c;请求路径&#xff0c;请求协议
请求方法&#xff1a;HTTP规范定义了8种可能的请求方法&#xff1a;
HEAD 与GET方法相同&#xff0c;服务器只返回状态行和头标&#xff0c;并不返回请求文档
POST 服务器接受被写入客户端输出流中的数据的请求
PUT 服务器保存请求数据作为指定URI新内容的请求
DELETE 服务器删除URI中命名的资源的请求
OPTIONS 关于服务器支持的请求方法信息的请求
TRACE Web服务器反馈Http请求和其头标的请求
CONNECT 已文档化但当前未实现的一个方法&#xff0c;预留做隧道处理
当然我们最常用的也就是get和post方法&#xff0c;get方法的请求方式比较简单&#xff0c;所有请求的参数都显示追加在请求的url后面&#xff0c;而且请求长度有限制&#xff0c;post方式的请求参数都追加在请求体当中&#xff0c;消息长度没有限制而且以隐式的方式进行发送&#xff0c;安全性相对较高&#xff08;这个安全性对于现在的网络技术也没有什么可安全的了&#xff0c;^_^&#xff09;。
请求路径&#xff1a;请求路径可以是相对或者绝对的方式&#xff0c;绝对路径不去阐述&#xff0c;相对路径是相对于当前TCP连接的主机的路径&#xff08;HTTP/1.0方式&#xff09;&#xff0c;在HTTP/1.1方式当中相对于的是请求头当中的host域&#xff0c;HTTP/1.1的新特性会在以后的方式当中进行阐述
请求协议&#xff1a;目前常用的支持HTTP/1.0和HTTP/1.1方式&#xff0c;HTTP/1.1和HTTP/1.0之间存在不少差异性&#xff0c;后面的博客当中会专门去讨论两者之间的异同&#xff0c;以及性能差异。
<-----------------------------------------------又是一道华丽的分割线------------------------------------------------------------>
请求头都是以key:value形式进行保存的&#xff0c;里面记录了客户端的一些基本信息&#xff0c;常用的请求头如下所示
Accept-Charset&#xff1a;浏览器可接受的字符集。
Accept-Encoding&#xff1a;浏览器能够进行解码的数据编码方式&#xff0c;比如gzip。Servlet能够向支持gzip的浏览器返回经gzip编码的HTML页面。许多情形下这可以减少5到10倍的下载时间。
Accept-Language&#xff1a;浏览器所希望的语言种类&#xff0c;当服务器能够提供一种以上的语言版本时要用到。
Authorization&#xff1a;授权信息&#xff0c;通常出现在对服务器发送的WWW-Authenticate头的应答中。
Connection&#xff1a;表示是否需要持久连接。如果Servlet看到这里的值为“Keep-Alive”&#xff0c;
或者看到请求使用的是HTTP 1.1&#xff08;HTTP 1.1默认进行持久连接&#xff09;&#xff0c;它就可以利用持久连接的优点&#xff0c;
当页面包含多个元素时&#xff08;例如Applet&#xff0c;图片&#xff09;&#xff0c;显著地减少下载所需要的时间。要实现这一点&#xff0c;
Servlet需要在应答中发送一个Content-Length头&#xff0c;最简单的实现方法是&#xff1a;先把内容写入
ByteArrayOutputStream&#xff0c;然后在正式写出内容之前计算它的大小。
Content-Length&#xff1a;表示请求消息正文的长度。
COOKIE&#xff1a;这是最重要的请求头信息之一&#xff0c;参见后面《COOKIE处理》一章中的讨论。
From&#xff1a;请求发送者的email地址&#xff0c;由一些特殊的Web客户程序使用&#xff0c;浏览器不会用到它。
Host&#xff1a;初始URL中的主机和端口。
If-Modified-Since&#xff1a;只有当所请求的内容在指定的日期之后又经过修改才返回它&#xff0c;
否则返回304“Not Modified”应答。
Pragma&#xff1a;指定“no-cache”值表示服务器必须返回一个刷新后的文档&#xff0c;即使它是代理服务器而且已经有了页面的
本地拷贝。
Referer&#xff1a;包含一个URL&#xff0c;用户从该URL代表的页面出发访问当前请求的页面。
User-Agent&#xff1a;浏览器类型&#xff0c;如果Servlet返回的内容与浏览器类型有关则该值非常有用。
UA-Pixels&#xff0c;UA-Color&#xff0c;UA-OS&#xff0c;UA-CPU&#xff1a;由某些版本的IE浏览器所发送的非标准的请求头&#xff0c;表示屏幕大小、颜色深度、操作系统和CPU类型。
如果想了解更详细的请求头信息可以去w3c的官网去查阅
<-----------------------------------------------又见分割线-----------------------------------------------------------
请求体&#xff08;又叫请求正文&#xff09;是post请求方式当中的请求参数&#xff0c;以key&#61;value形式进行存储&#xff0c;多个请求参数之间用&连接&#xff0c;如果请求当中有请求提&#xff0c;那么在请求头当中的Content-Length属性中记录的是该请求体的长度。
下面来看一个还算完整的请求消息吧&#xff0c;这样可能会稍微直观一点
Host: search.cnipr.com
User-Agent: Mozilla/5.0 (Windows; U; Windows NT 6.0; zh-CN; rv:1.9.1.13) Gecko/20100914 Firefox/3.5.13 ( .NET CLR 3.5.30729)
Accept: text/html,application/xhtml&#43;xml,application/xml;q&#61;0.9,*/*;q&#61;0.8
Accept-Language: zh-cn,zh;q&#61;0.5
Accept-Encoding: gzip,deflate
Accept-Charset: GB2312,utf-8;q&#61;0.7,*;q&#61;0.7
Keep-Alive: 300
Connection: keep-alive
Referer: http://search.cnipr.com/cnipr/zljs/hyjs-biaodan-y.jsp
Content-Length: 405
username&#61;guest&extension&#61;&issearch&#61;on&searchword&#61;pd%3D%2820100901%29&presearchword&#61;&sortfield&#61;RELEVANCE&sRecordNumber&#61;&searchType&#61;0&searchFrom&#61;0&channelid&#61;14%2C15%2C16&searchChannel&#61;14%2C15%2C16&strdb&#61;14&strdb&#61;15&strdb&#61;16&cizi&#61;2&sortcolumn&#61;RELEVANCE&R1&#61;-&txtA&#61;&txtB&#61;&txtC&#61;&txtD&#61;20100901&txtE&#61;&txtF&#61;&txtG&#61;&txtH&#61;&txtI&#61;&txtJ&#61;&txtK&#61;&txtL&#61;&txtM&#61;&txtN&#61;&txtP&#61;&txtQ&#61;&txtR&#61;&txtSearchWord&#61;&Submit&#61;%BC%EC%A1%A1%CB%F7