HTTP请求报文:
一个HTTP请求报文由四个部分组成:请求行、请求头部、空行、请求数据
1.请求行
请求行由请求方法字段、URL字段和HTTP协议版本字段3个字段组成,它们用空格分隔。比如 GET /data/info.html HTTP/1.1
方法字段就是HTTP使用的请求方法,比如常见的GET/POST
其中HTTP协议版本有两种:HTTP1.0/HTTP1.1 可以这样区别:
HTTP1.0对于每个连接都的建立一次连接一次只能传送一个请求和响应,请求就会关闭,HTTP1.0没有Host字段;而HTTP1.1在同一个连接中可以传送多个请求和响应,多个请求可以重叠和同时进行,HTTP1.1必须有Host字段。
2.请求头部
请求头部是 字段名:值 的格式展现
用于HTTP请求中的常用请求头字段Accept: 用于高速服务器,客户机支持的数据类型Accept-Charset: 用于告诉服务器,客户机采用的编码格式Accept-Encoding:用于告诉服务器,客户机支持的数据压缩格式Accept-Language:客户机的语言环境Host: 客户机通过这个头高速服务器,想访问的主机名If-Modified-Since:客户机通过这个头告诉服务器,资源的缓存时间Referer: 客户机通过这个头告诉服务器,它是从哪个资源来访问服务器的(防盗链)User-Agent: 客户机通过这个头告诉服务器,客户机的软件环境Cookie: 客户机通过这个头可以向服务器带数据Connection: 处理完这次请求后是否断开连接还是继续保持连接Date: 当前时间值
比如通过百度的GET某张图片--其相应请求头部
View Code
3.空行
空行的表现形式很直接,就是一个空行
它的作用是通过一个空行,告诉服务器请求头部到此为止
4.请求数据
若方法字段是GET,则此项为空,没有数据
若方法字段是POST,则通常来说此处放置的就是要提交的数据
比如要使用POST方法提交一个表单,其中有name字段中数据为“xiaoming",age字段为17
那么这里的请求数据就是 name=xiaoming&age=17 使用&来连接各个字段
总的来说,HTTP请求报文 就如同这张图所示-->
一个稍微完整的HTTP请求报文:
上面是POST方法,它的请求行URL段中一般是没有参数的,参数放在了报文体中
接下来看看GET方法,参数直接置于请求行URL中,报文体则为空
假设通过get方法,产生了这么一个链接:
<a href="http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=">http://www.google.cn/search?hl=zh-CN&source=hp&q=domety&aq=f&oq=</a>
则相应的请求报文为:
GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-Excel, application/vnd.ms-Powerpoint, application/msWord, application/x-silverlight, application/x-shockwave-Flash, */* Referer: <a href="http://www.google.cn/">http://www.google.cn/</a> Accept-Language: zh-cn Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld) Host: <a href="http://www.google.cn">www.google.cn</a> Connection: Keep-Alive Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g; NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-FxlRugatx63JLv7CWMD6UB_O_r
HTTP响应报文:
同样的,HTTP响应报文也由三部分组成:响应行、响应头、响应体
1.响应行
响应行一般由协议版本、状态码及其描述组成 比如 HTTP/1.1 200 OK
其中协议版本HTTP/1.1 或者HTTP/1.0
200就是它的状态码,OK则为它的描述
----------------------常见状态码---------------
100~199:表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。 200~299:表示成功接收请求并已完成整个处理过程。常用200 300~399:为完成请求,客户需进一步细化请求。例如:请求的资源已经移动一个新地址、常用302(意味着你请求我,我让你去找别人),307和304(我不给你这个资源,自己拿缓存) 400~499:客户端的请求有错误,常用404(意味着你请求的资源在web服务器中没有)403(服务器拒绝访问,权限不够) 500~599:服务器端出现错误,常用500
还有引自Vevb的说明
【1xx: 信息】100 Continue 服务器仅接收到部分请求,但是一旦服务器并没有拒绝该请求,客户端应该继续发送其余的请求。101 Switching Protocols 服务器转换协议:服务器将遵从客户的请求转换到另外一种协议。【2xx: 成功】200 OK 请求成功(其后是对GET和POST请求的应答文档。)201 Created 请求被创建完成,同时新的资源被创建。202 Accepted 供处理的请求已被接受,但是处理未完成。203 Non-authoritative Information 文档已经正常地返回,但一些应答头可能不正确,因为使用的是文档的拷贝。204 No Content 没有新文档。浏览器应该继续显示原来的文档。如果用户定期地刷新页面,而Servlet可以确定用户文档足够新,这个状态代码是很有用的。205 Reset Content 没有新文档。但浏览器应该重置它所显示的内容。用来强制浏览器清除表单输入内容。206 Partial Content 客户发送了一个带有Range头的GET请求,服务器完成了它。【3xx: 重定向】300 Multiple Choices 多重选择。链接列表。用户可以选择某链接到达目的地。最多允许五个地址。301 Moved Permanently 所请求的页面已经转移至新的url。302 Found 所请求的页面已经临时转移至新的url。303 See Other 所请求的页面可在别的url下被找到。304 Not Modified 未按预期修改文档。客户端有缓冲的文档并发出了一个条件性的请求(一般是提供If-Modified-Since头表示客户只想比指定日期更新的文档)。服务器告诉客户,原来缓冲的文档还可以继续使用。305 Use Proxy 客户请求的文档应该通过Location头所指明的代理服务器提取。306 Unused 此代码被用于前一版本。目前已不再使用,但是代码依然被保留。307 Temporary Redirect 被请求的页面已经临时移至新的url。【4xx: 客户端错误】400 Bad Request 服务器未能理解请求。401 Unauthorized 被请求的页面需要用户名和密码。402 Payment Required 此代码尚无法使用。403 Forbidden 对被请求页面的访问被禁止。404 Not Found 服务器无法找到被请求的页面。405 Method Not Allowed 请求中指定的方法不被允许。406 Not Acceptable 服务器生成的响应无法被客户端所接受。407 Proxy Authentication Required 用户必须首先使用代理服务器进行验证,这样请求才会被处理。408 Request Timeout 请求超出了服务器的等待时间。409 Conflict 由于冲突,请求无法被完成。410 Gone 被请求的页面不可用。411 Length Required "Content-Length" 未被定义。如果无此内容,服务器不会接受请求。412 Precondition Failed 请求中的前提条件被服务器评估为失败。413 Request Entity Too Large 由于所请求的实体的太大,服务器不会接受请求。414 Request-url Too Long 由于url太长,服务器不会接受请求。当post请求被转换为带有很长的查询信息的get请求时,就会发生这种情况。415 Unsupported Media Type 由于媒介类型不被支持,服务器不会接受请求。416 服务器不能满足客户在请求中指定的Range头。417 Expectation Failed 【5xx: 服务器错误】500 Internal Server Error 请求未完成。服务器遇到不可预知的情况。501 Not Implemented 请求未完成。服务器不支持所请求的功能。502 Bad Gateway 请求未完成。服务器从上游服务器收到一个无效的响应。503 Service Unavailable 请求未完成。服务器临时过载或当机。504 Gateway Timeout 网关超时。505 HTTP Version Not Supported 服务器不支持请求中指明的HTTP协议版本。View Code
更详细全面的状态码:
1 状态码 含义 原文(http://tool.oschina.net/commons?type=5) 2 3 100 客户端应当继续发送请求。这个临时响应是用来通知客户端它的部分请求已经被服务器接收,且仍未被拒绝。客户端应当继续发送请求的剩余部分,或者如果请求已经完成,忽略这个响应。服务器必须在请求完成后向客户端发送一个最终响应。 4 5 101 服务器已经理解了客户端的请求,并将通过Upgrade 消息头通知客户端采用不同的协议来完成这个请求。在发送完这个响应最后的空行后,服务器将会切换到在Upgrade 消息头中定义的那些协议。 只有在切换新的协议更有好处的时候才应该采取类似措施。例如,切换到新的HTTP 版本比旧版本更有优势,或者切换到一个实时且同步的协议以传送利用此类特性的资源。 6 7 102 由WebDAV(RFC 2518)扩展的状态码,代表处理将被继续执行。 8 9 200 请求已成功,请求所希望的响应头或数据体将随此响应返回。 10 11 201 请求已经被实现,而且有一个新的资源已经依据请求的需要而建立,且其 URI 已经随Location 头信息返回。假如需要的资源无法及时建立的话,应当返回 '202 Accepted'。 12 13 202 服务器已接受请求,但尚未处理。正如它可能被拒绝一样,最终该请求可能会也可能不会被执行。在异步操作的场合下,没有比发送这个状态码更方便的做法了。 返回202状态码的响应的目的是允许服务器接受其他过程的请求(例如某个每天只执行一次的基于批处理的操作),而不必让客户端一直保持与服务器的连接直到批处理操作全部完成。在接受请求处理并返回202状态码的响应应当在返回的实体中包含一些指示处理当前状态的信息,以及指向处理状态监视器或状态预测的指针,以便用户能够估计操作是否已经完成。 14 15 203 服务器已成功处理了请求,但返回的实体头部元信息不是在原始服务器上有效的确定集合,而是来自本地或者第三方的拷贝。当前的信息可能是原始版本的子集或者超集。例如,包含资源的元数据可能导致原始服务器知道元信息的超级。使用此状态码不是必须的,而且只有在响应不使用此状态码便会返回200 OK的情况下才是合适的。 16 17 204 服务器成功处理了请求,但不需要返回任何实体内容,并且希望返回更新了的元信息。响应可能通过实体头部的形式,返回新的或更新后的元信息。如果存在这些头部信息,则应当与所请求的变量相呼应。 如果客户端是浏览器的话,那么用户浏览器应保留发送了该请求的页面,而不产生任何文档视图上的变化,即使按照规范新的或更新后的元信息应当被应用到用户浏览器活动视图中的文档。 由于204响应被禁止包含任何消息体,因此它始终以消息头后的第一个空行结尾。 18 19 205 服务器成功处理了请求,且没有返回任何内容。但是与204响应不同,返回此状态码的响应要求请求者重置文档视图。该响应主要是被用于接受用户输入后,立即重置表单,以便用户能够轻松地开始另一次输入。 与204响应一样,该响应也被禁止包含任何消息体,且以消息头后的第一个空行结束。 20 21 206 服务器已经成功处理了部分 GET 请求。类似于 FlashGet 或者迅雷这类的 HTTP 下载工具都是使用此类响应实现断点续传或者将一个大文档分解为多个下载段同时下载。 该请求必须包含 Range 头信息来指示客户端希望得到的内容范围,并且可能包含 If-Range 来作为请求条件。 响应必须包含如下的头部域: Content-Range 用以指示本次响应中返回的内容的范围;如果是 Content-Type 为 multipart/byterange
新闻热点
疑难解答