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