Http协议

(一) Http协议入门

1.1 什么是http协议:

  超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议。所有的WWW文件都必须遵守这个标准。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。1960年美国人Ted Nelson构思了一种通过计算机处理文本信息的方法,并称之为超文本(hypertext),这成为了HTTP超文本传输协议标准架构的发展根基。Ted Nelson组织协调万维网协会(World Wide Web Consortium)和互联网工程工作小组(Internet Engineering Task Force )共同合作研究,最终发布了一系列的RFC,其中著名的RFC 2616定义了HTTP 1.1。

HTTP协议的主要特点可概括如下:

  • 1.支持客户/服务器模式。
  • 2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
  • 4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • 5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

1.2 查看http协议的简便工具:

1)使用火狐的firebug插件(右键->firebug->网络)

2)使用谷歌的“审查元素” -> 网络

3)使用系统自带的telnet工具(远程访问工具) 

  a)telnet localhost 8080      访问tomcat服务器

  b)ctrl+]     回车          可以看到回显

  c)输入请求内容

                                                                

GET /day09/hello HTTP/1.1

Host: localhost:8080

  d)回车,即可查看到服务器响应信息。

                    

1.3 http协议内容

(1) 请求( 浏览器 --> 服务器 )

1 GET /day09/hello HTTP/1.1               -请求行  请求方式  资源位置URI  协议版本
2 Host: localhost:8080                    --请求头(多个key-value对象)
3 User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0
4 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
5 Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3
6 Accept-Encoding: gzip, deflate
7 Connection: keep-alive
8                                     --一个空行
9 name=Infaraway&password=123456             --(可选)实体内容

(2) 响应(服务器  --> 浏览器)

1 HTTP/1.1 200 OK                --响应行   协议版本   状态码   状态描述
2 Server: Apache-Coyote/1.1         --响应头(key-vaule)
3 Content-Length: 24 
4 Date: Fri, 30 Jan 2015 01:54:57 GMT
5                                    --一个空行
6 this is hello servlet!!!           --实体内容

 

 

(二)Http请求

2.1 请求行

请求方法列举:

  • GET     请求获取Request-URI所标识的资源
  • POST    在Request-URI所标识的资源后附加新的数据
  • HEAD    请求获取由Request-URI所标识的资源的响应消息报头
  • PUT     请求服务器存储一个资源,并用Request-URI作为其标识
  • DELETE  请求服务器删除Request-URI所标识的资源
  • TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
  • CONNECT 保留将来使用
  • OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求

应用举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源;

  •   a)地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。
  •   b)GET提交参数数据有限制,不超过1KB。
  •   c)GET方式不适合提交敏感密码。
  •   d)注意: 浏览器直接访问的请求,默认提交方式是GET方式

POST方法:要求被请求服务器接受附在请求后面的数据,常用于提交表单。

  •   a)参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分割。
  •   b)POST提交的参数数据没有限制。
  •   c)POST方式提交敏感数据。

 

2.2  请求头

 1 Accept: text/html,image/*      -- 浏览器接受的数据类型
 2 Accept-Charset: ISO-8859-1     -- 浏览器接受的编码格式
 3 Accept-Encoding: gzip,compress  --浏览器接受的数据压缩格式
 4 Accept-Language: en-us,zh-       --浏览器接受的语言
 5 Host: www.it315.org:80          --(必须的)当前请求访问的目标地址(主机:端口)
 6 If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT  --浏览器最后的缓存时间
 7 Referer: http://www.it315.org/index.jsp      -- 当前请求来自于哪里
 8 User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)  --浏览器类型
 9 Cookie:name=eric                     -- 浏览器保存的cookie信息
10 Connection: close/Keep-Alive            -- 浏览器跟服务器连接状态。close: 连接关闭  keep-alive:保存连接。
11 Date: Tue, 11 Jul 2000 18:23:51 GMT      -- 请求发出的时间

 

2.3 实体内容

只有POST提交的参数会放到实体内容中

 

2.4 HttpServletRequest对象 

  HttpServletRequest对象 作用是用于获取请求数据

核心的API:
请求行:

  • request.getMethod(); 请求方式
  • request.getRequetURI() / request.getRequetURL() 请求资源
  • request.getProtocol() 请求http协议版本


请求头:

  • request.getHeader("名称") 根据请求头获取请求值
  • request.getHeaderNames() 获取所有的请求头名称

实体内容:

  • request.getInputStream() 获取实体内容数据

     

2.5 传递的请求参数的获取               

GET方式: 参数放在URI后面
POST方式: 参数放在实体内容中

获取GET方式参数:

  • request.getQueryString();

获取POST方式参数:

  • request.getInputStream();

问题:但是以上两种不通用,而且获取到的参数还需要进一步地解析。
所以可以使用统一方便的获取参数的方式:
核心的API:

  • request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数)
  • request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)
  • request.getParameterNames(); 获取所有参数名称列表

 

(三)Http响应

1 HTTP/1.1 200 OK                --响应行   协议版本   状态码   状态描述
2 Server: Apache-Coyote/1.1         --响应头(key-vaule)
3 Content-Length: 24 
4 Date: Fri, 30 Jan 2015 01:54:57 GMT
5                                    --一个空行
6 this is hello servlet!!!           --实体内容

 

3.1 状态码:

状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:

  • 1xx:指示信息--表示请求已接收,继续处理
  • 2xx:成功--表示请求已被成功接收、理解、接受
  • 3xx:重定向--要完成请求必须进行更进一步的操作
  • 4xx:客户端错误--请求有语法错误或请求无法实现
  • 5xx:服务器端错误--服务器未能实现合法的请求

常见状态代码、状态描述、说明:

  • 200 OK                           //客户端请求成功
  • 400 Bad Request             //客户端请求有语法错误,不能被服务器所理解
  • 401 Unauthorized            //请求未经授权,这个状态代码必须和WWW-Authenticate报头域一起使用 
  • 403 Forbidden                //服务器收到请求,但是拒绝提供服务
  • 404 Not Found                //请求资源不存在,eg:输入了错误的URL
  • 500 Internal Server Error //服务器发生不可预期的错误
  • 503 Server Unavailable    //服务器当前不能处理客户端的请求,一段时间后可能恢复正常

 

3.2 响应头:

 

 1 Location: http://www.it315.org/index.jsp   -表示重定向的地址,该头和302的状态码一起使用。
 2 Server:apache tomcat                 ---表示服务器的类型
 3 Content-Encoding: gzip                 -- 表示服务器发送给浏览器的数据压缩类型
 4 Content-Length: 80                    --表示服务器发送给浏览器的数据长度
 5 Content-Language: zh-cn               --表示服务器支持的语言
 6 Content-Type: text/html; charset=GB2312   --表示服务器发送给浏览器的数据类型及内容编码
 7 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT  --表示服务器资源的最后修改时间
 8 Refresh: 1;url=http://www.it315.org     --表示定时刷新
 9 Content-Disposition: attachment; filename=aaa.zip --表示告诉浏览器以下载方式打开资源(下载文件时用到)
10 Transfer-Encoding: chunked
11 Set-Cookie:SS=Q0=5Lb_nQ; path=/search   --表示服务器发送给浏览器的cookie信息(会话管理用到)
12 Expires: -1                           --表示通知浏览器不进行缓存
13 Cache-Control: no-cache
14 Pragma: no-cache
15 Connection: close/Keep-Alive           --表示服务器和浏览器的连接状态。close:关闭连接 keep-alive:保存连接

 

3.3 HttpServletResponse对象

HttpServletResponse对象修改响应信息:

响应行:

  • response.setStatus() 设置状态码

响应头:

  • response.setHeader("name","value") 设置响应头

实体内容:

  • response.getWriter().writer(); 发送字符实体内容
  • response.getOutputStream().writer() 发送字节实体内容

 

posted @ 2017-03-10 21:32  Infaraway  阅读(368)  评论(0编辑  收藏  举报