http协议:对浏览器和服务器端之间数据传输的格式规范。
版本有:
HTTP/1.0:客户端与web服务器建立连接后,只能获得一个web资源。
HTTP/2.0:允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
参看http协议格式的工具:
1)使用火狐浏览器的firebug插件。
2)使用谷歌浏览器的“审查元素”功能。
3)使用windows系统自带的telnet工具(远程访问工具)。
http协议分为两个部分:
1)http请求(浏览器->服务器)
2)http响应(服务器->浏览器)
http请求
每个http请求有请求行、请求头、和实体内容三部分组成。
格式如下:
GET /day09/hello HTTP/1.1 -请求行 Host: localhost:8080 --请求头(多个key-value对象) User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 Accept-Language: zh-cn,en-us;q=0.8,zh;q=0.5,en;q=0.3 Accept-Encoding: gzip, deflate Connection: keep-alive --一个空行 name=eric&password=123456 --(可选)实体内容
1)请求行
格式: 请求方式 统一资源标识符 协议版本
常见的术语:
请求资源:
URL: 统一资源定位符。http://localhost:8080/day09/testImg.html。只能定位互联网资源。是URI的子集。
URI: 统一资源标记符。/day09/hello。用于标记任何资源。可以是本地文件系统,局域网的资源(//192.168.14.10/myweb/index.html),互联网。
请求方式:
常见的请求方式: GET 、 POST、 HEAD、 TRACE、 PUT、 CONNECT 、DELETE
常用的请求方式: GET 和 POST
GET和POST请求方式的对比:
GET:
1)地址栏(URI)会跟上参数数据。以?开头,多个参数之间以&分割。
2)GET提交参数数据有限制,不超过1KB。
3)GET方式不适合提交敏感密码。
POST:
1)参数不会跟着URI后面。参数而是跟在请求的实体内容中。没有?开头,多个参数之间以&分割。
2)POST提交的参数数据没有限制。
3)POST方式提交敏感数据。
注意: 浏览器直接访问的请求,默认提交方式是GET方式
2)请求头
3)实体内容
只有post请求提交的参数会放到实体内容中。
HttpServletRequest对象
作用:用于获取请求数据。
核心API:
请求行:
request.getMethod(); 请求方式
request.getRequetURI() / request.getRequetURL() 请求资源
request.getProtocol() 请求http协议版本
请求头:
request.getHeader("名称") 根据请求头获取请求值
request.getHeaderNames() 获取所有的请求头名称
请求参数获取(post请求中的实体的实体内容):
GET:request.getQueryString();
POST: request.getInputStream();
由于以上获取参数的方式不通用,获取到参数之后需要进一步进行解析很麻烦,下面看一下比较通用的获取请求参数的API:
request.getParameter("参数名"); 根据参数名获取参数值(注意,只能获取一个值的参数)
request.getParameterValue("参数名“);根据参数名获取参数值(可以获取多个值的参数)
request.getParameterNames(); 获取所有参数名称列表
请求的解码格式:
修改POST方式参数编码:
request.setCharacterEncoding("utf-8");
修改GET方式参数编码:
手动解码:String name = new String(name.getBytes("iso-8859-1"),"utf-8");
Http响应
http响应包含响应行、响应头和实体内容三部分。具体格式如下:
1)响应行
格式:协议版本 状态码 状态描述
常见状态码:
200 : 表示请求处理完成并完美返回
302: 表示请求需要进一步细化。常用语重定向。
404: 表示客户访问的资源找不到。
500: 表示服务器的资源发送错误。(服务器内部错误)
2)响应头
HttpServletResponse对象
常用API:
响应行:
response.setStatus() 设置状态码
响应头:
response.setHeader("name","value");
实体内容:
response.getWriter.write(); 发送字符实体内容
response.getOutputStream.write(); 发送字节实体内容
响应编码格式设置:
response.setContentType("text/html;charset=utf-8");