http协议学习笔记

Http协议(Hyper Text Transfer Protocol)超文本传输协议

一、特点
1、基于TCP/IP的高级协议
2、默认端口号:80
3、基于“请求/响应”模型:1次请求对应1次响应
4、无状态的:每次请求之间相互独立,不能交互数据

二、历史版本
1.0:每次请求响应都会建立新得到连接
1.1:复用连接

三、请求消息数据格式
1、请求行(包含:请求方式 请求URL 请求协议/版本)
* GET /login.html HTTP/1.1
* 请求方式详细:
*HTTP协议有7种请求方式,常用的2种get和post:
* GET:请求参数在请求行中,URL后面;请求的URL长度有限制
* POST:请求参数在请求体中;请求的URL长度没有限制

2、请求头(请求头名称:请求头值【类似于key : value】)
* 常见的请求头
* User-Agent : 告诉服务器 浏览器版本信息
* 例如可以在服务器端获取该头信息,根据浏览器名称进行不同处理,解决浏览器兼容性问题
* Referer : 告诉服务器,我从哪里来
* 作用:
* 防盗链
* 便于统计

3、请求空行
空行(分隔请求头和请求体)

4、请求体(正文)——get没有请求体,Post有
封装POST请求消息的参数

四、响应消息数据格式

ServletRequest – 接口
| 继承
HttpServletRequest --接口
| 实现
org.apache.catalina.connector.RequestFacade 类(Tomcat)

=request功能=
1、获取请求消息数据
(1)获取请求行数据
* GET / day14 / demo1? name=maixiaodou&age=12 HTTP/1.1
* 方法:
(1.1)获取请求方式
String getMethod( ) // 返回 GET
(1.2)获取虚拟目录
String getContextPath( ) // 返回 /day14
(1.3)获取Servlet路径
String getServletPath( ) // 返回 /demo1
(1.4)获取get方式请求参数
String getQueryString( ) // 返回 name=maixiaodou&age=12
(1.5)获取请求URI
String getRequestURI( ) // 返回 /day14/demo1
String getRequestURL( ) // 返回 http://localhost/day14/demo1
(1.6)获取协议及版本
String getProtocol() // 返回 HTTP/1.1
(1.7)获取客户机的IP地址
String getRemoteAddr( )

(2)获取请求头数据
(2.1)通过请求头名称获取请求头的值
String getHeader(String name)
(2.2)获取所有请求头名称
Enumeration getHeaderNames( )

(3)获取请求体数据——POST才有
(3.1)获取流对象
	* 获取字符输入流,只能操作字符数据
		* BufferReader getReader( ) 
	* 获取字节输入流,可以操作所有类型数据
		* ServletInputStream getInputStream( )
(3.2)再从流对象中拿数据


(4)重要功能(不管post还是get)
(4.1)获取请求参数通用方式
		* String getParameter(String name):根据参数名称获取参数值
		* String[ ] getParamterValues(String name):根据参数名称获取参数值的数组
		* Enumeration<String> getParameterNames( ):获取所有请求的参数名称
		* Map<String, String[ ]>getParameterMap( ):获取所有参数的map集合

2、乱码问题:
Tomcat8已经处理get方式乱码问题,post请求需要在数据参数之前先request.setCharacterEncoding(“utf-8”)

3、请求转发:
用法:
HTTPServletRequest的对象request可以通过request。getRequestDispatcher("/someSource").forward(request, response)
转发请求,访问项目内部资源/someSource。

特点:
* 浏览器地址路径不变化
* 只能转发到当前服务器内部资源,无法访问外部资源如www.baidu.com
* 只使用同一次请求

4、请求转发可以传递数据:
* 域对象:一个有作用范围的对象,可以在范围内共享数据
* request域:代表一次请求的范围,一般用于请求转发的多个资源共享数据
* 方法:
(4.1)void setAttribute(String name, Object obj):初始化数据的key-value
(4.2)Object getAttribute(String name):受请求的资源可以通过key获取value
(4.3)void removeAtrribute(String name):移除键值对

=response功能=
1、响应消息:服务端发送给客户端的数据
* 数据格式(类似请求消息的数据格式)
响应行、响应头、响应空行、响应体
(1.1)响应行
* 组成:协议 / 版本 响应状态码 状态码描述
* 响应状态码(服务器告诉浏览器,本次请求和响应的状态)
* 分类
& 100多:服务器接收客户端消息,没有接收完成,等待一段时间后,发送该类状态码
& 200多:成功。代表:200
& 300多:重定向。代表:302(重定向),304(访问缓存)
& 400多:客户端错误。代表:404(请求不到路径对应的资源)405(请求方式没有对应的方法,如缺post或get)
& 500多:服务端错误。代表:500(连接成功,但服务器内部异常)
* 重定向:浏览器向服务器发送请求,服务器说你去访问哪个资源,响应状态码就会携带302,然后浏览器就会去访问那个资源
* 访问缓存:浏览器向服务器第1次发送请求如图片(浏览器获得图片后会在本地缓存);
浏览器第2次发送相同请求,服务器说你要访问的资源在服务器没有修改,你去找你浏览器的缓存吧,
响应状态码就会携带304,然后浏览器就会去访问自己的缓存。

(1.2)响应头
	* Content-Type:服务器告诉浏览器本次响应体数据格式和编码格式
	* Content-disposition:服务器告诉浏览器以什么格式打开响应体数据
		值:
		& in-line:默认值,在当前页面内打开
		& attachment、filename==xxx:以附件形式打开响应体、文件下载
(1.3)响应体:服务器响应给浏览器的数据

2、response对象
* 功能:设置响应消息
(2.1)设置响应行:
* 格式 HTTP/1.1 200 ok
* 设置状态码:setStatus(int sc)
(2.2)设置响应头:
* setHeader(String name, String value)
(2.3)设置响应体:
* 使用步骤
(2.3.1)获取输出流
& 字符输出流:PrintWriter getWriter( )——只能输出字符串
& 字节输出流:ServletOutputStream getOutPutStream( )——能输出任意格式
(2.3.2)使用输出流,将数据输出到浏览器

* 案例:
& 完成重定向:代码实现
response.setStatus(302);
response.setHeader("location", "/someSources/haha");

或者更简洁:
response.sendRedirect("/someSources/haha");

& redirect重定向特点
1、地址栏发生变化
2、重定向可以访问其他站点(可以是非本项目)
3、重定向是两次请求。不能使用request转发数据

& forward转发的特点
1、转发地址栏不变
2、转发只能访问当前服务器下的资源
3、转发是一次请求,可以用request对象来转发数据

& 路径写法:
1、相对路径(需要知道当前资源与目标资源的相对关系)
2、绝对路径
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

luxiaopengyou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值