Http协议的学习笔记
学习之前的思考:
1.这个技术是做什么的?
HTTP是一个基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等),是用于从万维网服务器传输超文本到本地浏览器的传送协议。
2.这个技术的特点是什么?
①简单快速:客户端向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有:GET、HEAD、POST。由于HTTP协议简单,使得HTTP服务器的程序规模小,通信速度快。
②灵活:HTTP允许传输任意类型的数据对象(传输的对象类型由Content-Type标记0)。
③无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,,并收到客户的应答后,即断开连接。这种方式可以节省传输时间。
④无状态:HTTP协议是无状态的,对事务处理没有记忆能力,也就是说后续处理需要前面的信息,则必须重传,这样会导致连接传送的数据量变大。另外,在服务器不需要先前信息的时候它的应答就较快(可以和session和cookie做类比)
3.这个技术的原理是什么?
HTTP协议定义Web客户端如何从Web服务器请求Web页面,以及服务器如何把Web页面传送给客户端。HTTP协议采用了请求/响应模型。客户端向服务端发送一个请求报文,请求报文包含请求的方法、URL、协议版本、请求头部和请求数据。服务器以一个状态行作为响应,响应的内容包括协议的版本、成功或者错误代码、服务器信息、响应头部和响应数据。
笔记:
HTTP 请求消息Request:
客户端发送一个HTTP请求到服务端的请求消息包括以下格式:
请求行、请求头部、空行和请求数据四个部分。
①请求行:用来说明请求类型,要访问的资源以及所使用的HTTP版本。
②请求头部(2-6行):说明服务器要使用的附加信息
③空行:请求头部后面的空行是必须的
④请求数据:是主体,可以添加任意数据。
HTTP 响应消息Response:
HTTP响应也由四部分组成:状态行、消息报头、空行和响应正文
①状态行:包含HTTP协议版本号,状态码,状态消息
②消息报头:用来说明客户端要使用的附加信息
③空行:消息报头后面的空行是必须的
④响应正文:服务器返回给客户端的文本信息
(本文内容转载自:https://www.jianshu.com/p/80e25cb1d81a)
HTTP协议通过HttpServletRequest和HttpServletResponse两个对象来对接收请求和发送响应来进行封装。
1.HttpServletRequest:
1).介绍:
HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中,通过这个对象提供的方法,可以获得客户端请求的所有信息。
2).Request常用方法:
①获得客户机信息:
getRequestURL方法返回客户端发出请求时的完整URL
getRequestURI方法返回请求行中的资源部分
getQueryString方法返回请求行中的参数部分
getPathInfo方法返回请求URL中的额外路径信息。额外路径信息是请求URL中的位于Servlet的路径之后和查询参数之前的内容,它以“/”开头
getRemoteAddr方法返回发出请求的客户机的IP地址
getRemoteHost方法返回发出请求的客户机的完整主机名
getRemotePort方法返回客户机所使用的网络端口号
getLocalAddr方法返回WEB服务器的IP地址
getLocalName方法返回WEB服务器的主机名
2)获得客户机请求头:
String getHeader(String name)
Enumeration getHeaders(String name)
getHeaderNames()
3)获得客户机请求参数(客户端提交的数据):
getParameter(String) 接收表单参数
getParameterValues(String name) 接收表单参数
getParameterNames() 获取所有参数名
getParameterMap() request对象封装的参数是以Map的形式存储的
2.HttpServletResponse对象介绍:
HttpServletResponse继承了ServletResponse接口,并提供了与Http协议有关的方法,这些方法的主要功能是设置HTTP状态码和管理Cookie。HttpServletResponse对象代表服务器的响应。这个对象中封装了向客户端发送数据,发送给响应头,发送响应状态码的方法。
HttpServletResponse对象可以向客户端发送三种类型的数据:
①响应头 ②状态码 ③实体数据
常用方法:
addHeader(String name,String value)将指定的名字和值加入到响应的头信息中
encondeURL(String url) 编码指定的URL
sendError(int sc)使用指定状态码发送一个错误到客户端
setDateHeader(String name,long date)将给出的名字和日期设置响应的头部
setHeader(String name,String value)将给出的名字和值设置响应的头部
消息实体内容,通过输出流对象进行设置,用以下两个方法:
Resonse.getOutputStream() 字节输出流对象
Resonse.getWriter() 字符的输出流对象
getOutputStrem和getWriter方法的比较
1)getOutputStream方法用于返回Servlet引擎创建的字节输出流对象,Servlet程序可以按字节形式输出响应正文
2)getWriter方法用于返回Servlet引擎创建的字符输出流对象,Servlet程序可以按字符形式输出响应正文。
注意:getOutputStream和getWriter这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一个方法。要不然会抛出错误。
3)getOutputStream 方法返回的是字节输出流对象的类型为ServletOutputStream,它可以直接输出字节数组中的二进制数据。
4)getWriter方法将Servlet引擎的数据缓冲区包装成PrintWriter类型的字符输出流对象后返回,PrintWriter对象可以直接输出字符文本内容