HTTP报文

HTTP请求报文解剖  

http请求报文由3部分组成(请求行、请求头、请求体)

HTTP报文_第1张图片

实际请求报文

HTTP报文_第2张图片

①是请求方法,GET和POST是最常见的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”的方式传递请求参数

对照上面的请求报文,我们把它进一步分解,你可以看到一幅更详细的结构图:

HTTP报文_第3张图片


常见的HTTP请求报文头属性  

Accept  -请求报文通过一个Accept报文属性告诉服务器,客户端接收什么类型的响应;Accept属性的值可以为一个或多个MIME类型的值,

MIME格式:大类型/小类型[;参数]

Accept:text/plain  

比如:

  text/html,html文件

  text/css,css文件

  text/javascript,js文件

  image/*,所有图片文件

Cookie --客户端的cookie就是通过这个报文头属性传给服务器端

Cookie: $Version=1; Skin=new;jsessionid=5F4771183629C9834F8382E23BE13C4C 

服务端是怎么知道客户端的多个请求是隶属于一个Session呢?注意到后台的那个jsessionid=5F4771183629C9834F8382E23BE13C4C木有?原来就是通过HTTP请求报文头的Cookie属性的jsessionid的值关联起来的!(当然也可以通过重写URL的方式将会话ID附带在每个URL的后面哦)。

Referer:

表示这个请求是从哪个URL过来的,假如你通过google搜索出一个商家的广告页面,你对这个广告页面感兴趣,鼠标一点发送一个请求报文到商家的网站,这个请求报文的Referer报文头属性值就是http://www.google.com。

Cache-Control

对缓存进行控制,如一个请求希望响应返回的内容在客户端要被缓存一年,或不希望被缓存就可以通过这个报文头达到目的。 

如以下设置,相当于让服务端将对应请求返回的响应内容不要在客户端缓存:

Cache-Control: no-cache  

User-Agent:浏览器通知服务器,客户端浏览器与操作系统相关信息

ser-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) uChrome/69.0.3497.100 Safari/537.36

Connection:表示客户端与服务连接类型;Keep-Alive表示持久连接,close已关闭 

Connection: keep-alive

 Content-Length:请求体的长度

 


POST http://39.108.107.149:8080/vk/app/rest/ddp/iModelServiceImpl/findModelByType HTTP/1.1
User-Agent: Fiddler
Host: 39.108.107.149:8080
Content-Length: 11
 

 Host:请求的服务器主机名

Content-Type:请求的与实体对应的MIME信息。如果是post请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码

Content-Type: application/x-www-form-urlencoded

Accept-Encoding:浏览器通知服务器,浏览器支持的数据压缩格式。如GZIP压缩

Accept-Encoding: gzip, deflate

Accept-Language:浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n)

Accept-Language: zh-CN,zh;q=0.9

如何访问请求报文头

由于请求报文头是客户端发过来的,服务端当然只能读取了,以下是HttpServletRequest一些用于读取请求报文头的API:

//获取请求报文中的属性名称  
java.util.Enumeration   getHeaderNames();  
  
//获取指定名称的报文头属性的值  
java.lang.String getHeader(java.lang.String name)   


//获取报文头中的Cookie(读取Cookie的报文头属性)  
 Cookie[]   getCookies() ;  
  
//获取客户端本地化信息(读取 Accept-Language 的报文头属性)  
java.util.Locale    getLocale()   
  
//获取请求报文体的长度(读取Content-Length的报文头属性)  
int getContentLength();  

HttpServletRequest可以通过 

HttpSession getSession()  

获取请求所关联的HttpSession,其内部的机理是通过读取请求报文头中Cookie属性的JSESSIONID的值,在服务端的一个会话Map中,根据这个JSESSIONID获取对应的HttpSession的对象。(这样,你就不会觉得HttpSession很神秘了吧,你自己也可以做一个类似的会话管理    )

 

HTTP响应报文解剖  

响应报文结构   HTTP的响应报文也由三部分组成( 响应行+响应头+响应体 ): 

HTTP报文_第4张图片

HTTP报文_第5张图片

①报文协议及版本; 
②状态码及状态描述; 
③响应报文头,也是由多个属性组成; 
④响应报文体,即我们真正要的“干货”。 

 

响应状态码--和请求报文相比,响应报文多了一个'响应状态码',它以'清晰明确'的语言告诉客户端本次请求的处理结果

Http的响应状态码由5段组成

  1. 1xx 消息,一般是告诉客户端,请求已经收到了,正在处理,别急...
  2. 2xx 处理成功,一般表示:请求收悉、我明白你要的、请求已受理、已经处理完成等信息.
200 OK:客户端请求成功
204 No Content:无内容。服务器成功处理,但未返回内容。一般用在只是客户端向服务器发送信息,而服务器不用向客户端返回什么信息的情况。不会刷新页面。
206 Partial Content:服务器已经完成了部分GET请求(客户端进行了范围请求)。响应报文中包含Content-Range指定范围的实体内容
  1. 3xx 重定向到其它地方。它让客户端再发起一个请求以完成整个处理。
301 Moved Permanently:永久重定向,表示请求的资源已经永久的搬到了其他位置。

302 Found:临时重定向,表示请求的资源临时搬到了其他位置

303 See Other:临时重定向,应使用GET定向获取请求资源。303功能与302一样,区别只是303明确客户端应该使用GET访问

307 Temporary Redirect:临时重定向,和302有着相同含义。POST不会变成GET

304 Not Modified:表示客户端发送附带条件的请求(GET方法请求报文中的IF…)时,条件不满足。返回304时,不包含任何响应主体。虽然304被划分在3XX,但和重定向一毛钱关系都没有
  1. 4xx 处理发生错误,责任在客户端,如客户端的请求一个不存在的资源,客户端未被授权,禁止访问等。
400 Bad Request:客户端请求有语法错误,服务器无法理解。
401 Unauthorized:请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用。
403 Forbidden:服务器收到请求,但是拒绝提供服务
404 Not Found:请求资源不存在。比如,输入了错误的url
415 Unsupported media type:不支持的媒体类型
  1. 5xx 处理发生错误,责任在服务端,如服务端抛出异常,路由出错,HTTP版本不支持等。
500 Internal Server Error:服务器发生不可预期的错误。
503 Server Unavailable:服务器当前不能处理客户端的请求,一段时间后可能恢复正常,

 

常见的HTTP响应报文头属性  

常见请求头 描述
Location 指定响应的路径,需要与状态码302配合使用,完成跳转。
Content-Type

响应正文的类型(MIME类型)

取值:text/html;charset=UTF-8

Content-Disposition

通过浏览器以下载方式解析正文

取值:attachment;filename=xx.zip

Set-Cookie 与会话相关技术。服务器向浏览器写入cookie
Content-Encoding

服务器使用的压缩格式

取值:gzip

Content-length 响应正文的长度
Refresh

定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页。

取值:3;url=www.itcast.cn    //三秒刷新页面到www.itcast.cn

Server 指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml配置进行修改。
Last-Modified 服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用。
Cache-Control  响应输出到客户端后,服务端通过该报文头属告诉客户端如何控制响应内容的缓存。常见的取值有常见的取值有private、public、no-cache、max-age,no-store,默认为private。缓存时间为31536000秒(365天)

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Cache-Control  --响应输出到客户端后,服务端通过该报文头属性告诉客户端如何控制响应内容的缓存
下面,的设置让客户端对响应内容缓存3600秒,也即在3600秒内,如果客户再次访问该资源,直接从客户端的缓存中返回内容给客户,不要再从服务端获取 (当然,这个功能是靠客户端实现的,服务端只是通过这个属性提示客户端“应该这么做”,做不做,还是决定于客户端,如果是自己宣称支持HTTP的客户端,则就应该这样实现)

Cache-Control: max-age=3600  

 Location

我们在JSP中让页面Redirect到一个某个A页面中,其实是让客户端再发一个请求到A页面,这个需要Redirect到的A页面的URL,其实就是通过响应报文头的Location属性告知客户端的,如下的报文头属性,将使客户端redirect到iteye的首页中

Location: http://www.iteye.com  

 Set-Cookie--服务端可以设置客户端的Cookie,其原理就是通过这个响应报文头属性实现的: 

Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1  

如何写HTTP请求报文头

在服务端可以通过HttpServletResponse的API写响应报文头的属性:

//添加一个响应报文头属性  
void    setHeader(String name, String value)  

//添加Cookie报文头属性  
void addCookie(Cookie cookie)   
  
//不但会设置Location的响应报文头,还会生成303的状态码呢,两者天仙配呢  
void    sendRedirect(String location)  

你可能感兴趣的:(http)