HTTP请求行、请求头、请求体详解

HTTP请求⾏、请求头、请求体详解
HTTP请求报⽂解剖  请求报⽂由3部分组成(请求⾏+请求头+请求体):  下⾯是⼀个实际的请求报⽂:  ①是请求⽅法,GET和是最常见的HTTP⽅法,除此以外还包括DELETE、HEAD、OPTIONS、PUT、TRACE。不过,当前的⼤多数浏览器只⽀持GET和POST,Spring 3.0提供了⼀个HiddenHttpMethodFilter,允许你通过“_method”的表单参数指定这些特殊的HTTP⽅法(实际上还是通过POST提交表单)。服务端配置了HiddenHttpMethodFilter后,Spring会根据_method参数指定的值模拟出相应的HTTP⽅法,这样,就可以使⽤这些HTTP⽅法对处理⽅法进⾏映射了。
②为请求对应的URL地址,它和报⽂头的Host属性组成完整的请求URL,③是协议名称及版本号。  ④是HTTP的报⽂头,报⽂头包含若⼲个属性,格式
为“属性名:属性值”,服务端据此获取客户端的信息。  ⑤是报⽂体,它将⼀个页⾯表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成⼀个格式化串,它承载多个请求参数的数据。不但报⽂体可以传递请求参数,请求URL也可以通过类似于“/chapter15/user.html?
param1=value1¶m2=value2”的⽅式传递请求参数。  对照上⾯的请求报⽂,我们把它进⼀步分解,你可以看到⼀幅更详细的结构图:
引⽤
是强⼤的⽹页数据分析⼯具,安装后将集成到Internet Explorer⼯具栏中。它不⽤代理服务器或⼀些复杂的⽹络监控⼯具,就能抓取请求及响应的完整信息,包括Cookies、消息头、查询参数、响应报⽂等,是Web应⽤开发⼈员的必备⼯具。
HTTP请求报⽂头属性  报⽂头属性是什么东西呢?我们不妨以⼀个⼩故事来说明吧。
引⽤
快到中午了,张三丰不想去⾷堂吃饭,于是打电话叫外卖:⽼板,我要⼀份[鱼⾹⾁丝],要12:30之前给我送过来哦,我在江湖湖公司研发部,叫张三丰。
这⾥,你要[鱼⾹⾁丝]相当于HTTP报⽂体,⽽“12:30之前送过来”,你叫“张三丰”等信息就相当于HTTP的报⽂头。它们是⼀些附属信息,帮忙你和饭店⽼板顺利完成这次交易。
请求HTTP报⽂和响应HTTP报⽂都拥有若⼲个报⽂关属性,它们是为协助客户端及服务端交易的⼀些附属信息。
常见的HTTP请求报⽂头属性 Accept  请求报⽂可通过⼀个“Accept”报⽂头属性告诉服务端 客户端接受什么类型的响应。  如下报⽂头相当于告诉服务端,俺客户端能够接受的响应类型仅为纯⽂本数据啊,你丫别发其它什么图⽚啊,视频啊过来,那样我会歇菜的~~~:
acceptlanguage
Java代码
1. Accept:text/plain
Accept属性的值可以为⼀个或多个MIME类型的值,关于MIME类型,⼤家请参考:
Cookie  客户端的Cookie就是通过这个报⽂头属性传给服务端的哦!如下所⽰:
Java代码
1. Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C
服务端是怎么知道客户端的多个请求是⾪属于⼀个呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C⽊有?原来就是通过HTTP请求报⽂头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的⽅式将会话ID附带在每个URL的后⾯哦)。
Referer  表⽰这个请求是从哪个URL过来的,假如你通过google搜索出⼀个商家的⼴告页⾯,你对这个⼴告页⾯感兴趣,⿏标⼀点发送⼀个请求报⽂到商家的⽹站,这个请求报⽂的Referer报⽂头属性值就是le。
引⽤
唐僧到了西天.
如来问:侬是不是从东⼟⼤唐来啊?
唐僧:厉害!你咋知道的!
如来:呵呵,我偷看了你的
很多貌似神奇的⽹页监控软件(如著名的 ),只要在你的⽹页上放上⼀段JavaScript,就可以帮你监控流量,全国访问客户的分布情况等报表和图表,其原理就是通过这个Referer及其它⼀些HTTP报⽂头⼯作的。
Cache-Control  对缓存进⾏控制,如⼀个请求希望响应返回的内容在客户端要被缓存⼀年,或不希望被缓存就可以通过这个报⽂头达到⽬的。  如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存:
Java代码
1. Cache-Control: no-cache
其它请求报⽂头属性  参见: 如何访问请求报⽂头  由于请求报⽂头是客户端发过来的,服务端当然只能读取了,以下是HttpServletRequest⼀些⽤于读取请求报⽂头的:
Java代码
1. //获取请求报⽂中的属性名称
2. java.util.Enumeration<java.lang.String>  getHeaderNames();
3.
4. //获取指定名称的报⽂头属性的值
5. java.lang.String getHeader(java.lang.String name)
由于⼀些请求报⽂头属性“太著名”了,因此HttpServletRequest为它们提供了VIP的API:
Java代码
1. //获取报⽂头中的Cookie(读取Cookie的报⽂头属性)
2.  Cookie[]  getCookies() ;
3.
4. //获取客户端本地化信息(读取 Accept-Language 的报⽂头属性)
5. java.util.Locale    getLocale()
6.
7. //获取请求报⽂体的长度(读取Content-Length的报⽂头属性)
8. int getContentLength();
HttpServletRequest可以通过
Java代码
1. HttpSession getSession()
获取请求所关联的HttpSession,其内部的机理是通过读取请求报⽂头中Cookie属性的JSESSIONID的值,在服务端的⼀个会话Map中,根据这个JSESSIONID获取对应的HttpSession的对象。(这样,你就不会觉得HttpSession很神秘了吧,你⾃⼰也可以做⼀个类似的会话管理  )
HTTP响应报⽂解剖 响应报⽂结构  HTTP的响应报⽂也由三部分组成(响应⾏+响应头+响应体):  以下是⼀个实际的HTTP响应报⽂:  ①报⽂协议及版本;  ②状态码及状态描述;  ③响应报⽂头,也是由多个属性组成;  ④响应报⽂体,即我们真正要的“⼲货”。 响应状态码  和请求报⽂相⽐,响应报⽂多了⼀个“响应状态码”,它以“清晰明确”的语⾔告诉客户端本次请求的处理结果。  HTTP的响应状态码由5段组成:
1xx 消息,⼀般是告诉客户端,请求已经收到了,正在处理,别急...
2xx 处理成功,⼀般表⽰:请求收悉、我明⽩你要的、请求已受理、已经处理完成等信息.
3xx 重定向到其它地⽅。它让客户端再发起⼀个请求以完成整个处理。
4xx 处理发⽣错误,责任在客户端,如客户端的请求⼀个不存在的资源,客户端未被授权,禁⽌访问等。
5xx 处理发⽣错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不⽀持等。
以下是⼏个常见的状态码:
200 OK  你最希望看到的,即处理成功! 303 See Other  我把你redirect到其它的页⾯,⽬标的URL通过响应报⽂头的Location告诉你。
引⽤
悟空:师傅给个桃吧,⾛了⼀天了
唐僧:我哪有桃啊!去王母娘娘那吧
304 Not Modified  告诉客户端,你请求的这个资源⾄你上次取得后,并没有更改,你直接⽤你本地的缓存吧,我很忙哦,你能不能少来烦我啊! 404 Not Found  你最不希望看到的,即不到页⾯。如你在google上到⼀个页⾯,点击这个链接返回404,表⽰这个页⾯已经被⽹站删除了,google那边的记录只是美好的回忆。 500 Internal Server Error  看到这个错误,你就应该查查服务端的⽇志了,肯定抛出了⼀堆异常,别睡了,起来改BUG去吧!  其它的状态码参见:  有些响应码,Web应⽤服务器会⾃动给⽣成。你可以通过HttpServletResponse的API设置状态码:
Java代码
1. //设置状态码,状态码在HttpServletResponse中通过⼀系列的常量预定义了,如SC_ACCEPTED,SC_OK
2. void    setStatus(int sc)
常见的HTTP响应报⽂头属性 Cache-Control  响应输出到客户端后,服务端通过该报⽂头属告诉客户端如何控制响应内容的缓存。  下⾯,的设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取(当然,这个功能是靠客户端实现的,服务端只是通过这个属性提⽰客户端“应该这么做”,做不做,还是决定于客户端,如果是⾃⼰宣称⽀持HTTP的客户端,则就应该这样实现)。
Java代码
1. Cache-Control: max-age=3600
ETag  ⼀个代表响应服务端资源(如页⾯)版本的报⽂头属性,如果某个服务端资源发⽣变化了,这个ETag就会相应发⽣变化。它是Cache-Control的有益补充,可以让客户端“更智能”地处理什么时候要从服务端取资源,什么时候可以直接从缓存中返回响应。  关于ETag的说明,你可以参见:。  3.0还专门为此提供了⼀个org.springframework.web.filter.ShallowEtagHeaderFilter(实现原理很简单,对JSP输出的内容MD5,这样内容有变化ETag就相应变化了),⽤于⽣成响应的ETag,因为这东东确实可以帮助减少请求和响应的交互。  下⾯是⼀个ETag:
Java代码
1. ETag: "737060cd8c284d8af7ad3082f209582d"
Location  我们在JSP中让页⾯Redirect到⼀个某个A页⾯中,其实是让客户端再发⼀个请求到A页⾯,这个需要Redirect到的A页⾯的URL,其实就是通过响应报⽂头的Location属性告知客户端的,如下的报⽂头属性,将使客户端redirect到iteye的⾸页中:
Java代码
1. Location: www.iteye
Set-Cookie  服务端可以设置客户端的Cookie,其原理就是通过这个响应报⽂头属性实现的:
Java代码
1. Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1
其它HTTP响应报⽂头属性  更多其它的HTTP响应头报⽂,参见: 如何写HTTP请求报⽂头  在服务端可以通过HttpServletResponse的API写响应报⽂头的属性:
Java代码
1. //添加⼀个响应报⽂头属性
2. void    setHeader(String name, String value)
象Cookie,Location这些响应都是有福之⼈,HttpServletResponse为它们都提供了VIP版的API:
Java代码
1. //添加Cookie报⽂头属性
2. void addCookie(Cookie cookie)
3.
4. //不但会设置Location的响应报⽂头,还会⽣成303的状态码呢,两者天仙配呢
5. void    sendRedirect(String location)
HTTP简介
是Hyper Text Transfer Protocol(超⽂本传输协议)的缩写,是⽤于从万维⽹(WWW:World Wide Web )服务器传输超⽂本到本地浏览器的传送协议。。
HTTP是⼀个基于TCP/IP通信协议来传递数据(HTML ⽂件, 图⽚⽂件, 查询结果等)。
HTTP⼯作原理
HTTP三点注意事项:
HTTP是⽆连接:⽆连接的含义是限制每次连接只处理⼀个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采⽤这种⽅式可以节省传输时间。
HTTP是媒体独⽴的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使⽤适合的MIME-type内容类型。
HTTP是⽆状态:HTTP协议是⽆状态协议。⽆状态是指协议对于事务处理没有记忆能⼒。缺少状态意味着如果后续处理需要前⾯的信息,则它必须重传,这样可能导致每次连接传送的数据量增⼤。另⼀⽅⾯,在服务器不需要先前信息时它的应答就较快。
HTTP消息结构
HTTP请求消息
⼀个HTTP请求报⽂由请求⾏(request line)、请求头(header)、空⾏和请求数据4个部分组成,下图给出了请求报⽂的⼀般格式。
1.请求⾏
请求⾏由请求⽅法字段、URL字段和HTTP协议版本字段3个字段组成,它们⽤空格分隔。例如,GET /index.html HTTP/1.1。
根据HTTP标准,HTTP请求可以使⽤多种请求⽅法。
HTTP1.0定义了三种请求⽅法: GET, POST 和 HEAD⽅法。
HTTP1.1新增了五种请求⽅法:OPTIONS, , DELETE, TRACE 和 CONNECT ⽅法。
⽽常见的有如下⼏种:
1).GET
最常见的⼀种请求⽅式,当客户端要从服务器中读取⽂档时,当点击⽹页上的链接或者通过在浏览器的地址栏输⼊⽹址来浏览⽹页的,使⽤的都是GET⽅式。GET⽅法要求服务器将URL定位的资源放在响应报⽂的数据部分,回送给客户端。使⽤GET⽅法时,请求参数和对应的值附加在URL后⾯,利⽤⼀个问号(“?”)代表URL的结尾与请求参数的开始,传递参数长度受限制。例如,/index.jsp?id=100
&op=bind,这样通过GET⽅式传递的数据直接表⽰在地址中,所以我们可以把请求结果以链接的形式发送给好友。以⽤google搜索domety为例,Request格式如下:
[html]
1. GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
2. Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
3. application/msword, application/x-silverlight, application/x-shockwave-flash, */*
4. Referer: <a href=“le/”>le/</a>
5. Accept-Language: zh-cn
6. Accept-Encoding: gzip, deflate
7. User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
8. Host: <a href=“le”&le</a>
9. Connection: Keep-Alive
10. Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
11. NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-
2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
12. FxlRugatx63JLv7CWMD6UB_O_r
1GET /search?hl=zh-CN&source=hp&q=domety&aq=f&oq= HTTP/1.1
2Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/vnd.ms-excel, application/vnd.ms-powerpoint,
3application/msword, application/x-silverlight, application/x-shockwave-flash, */*
4Referer: <a href="le/">le/</a>
5Accept-Language: zh-cn
6Accept-Encoding: gzip, deflate
7User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; TheWorld)
8Host: <a href="le"&le</a>
9Connection: Keep-Alive
10Cookie: PREF=ID=80a06da87be9ae3c:U=f7167333e2c3b714:NW=1:TM=1261551909:LM=1261551917:S=ybYcq2wpfefs4V9g;
11NID=31=ojj8d-IygaEtSxLgaJmqSjVhCspkviJrB6omjamNrSm8lZhKy_yMfO2M4QMRKcH1g0iQv9u-2hfBW7bUFwVh7pGaRUb0RnHcJU37y-
12FxlRugatx63JLv7CWMD6UB_O_r
1
2

本文发布于:2024-09-22 08:28:11,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/371332.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:请求   客户端   响应   服务端   属性
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议