Http协议
Posted 在那不遥远的地方
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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() 发送字节实体内容
以上是关于Http协议的主要内容,如果未能解决你的问题,请参考以下文章