HTTP协议(一)
- 什么是HTTP协议
- 客户端连上web服务器后,如果想要获得web服务器中的某个web资源,需要遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器之间通讯的格式;
- 基于TCP连接的传输协议;
- 默认端口是80;
- 基于请求响应模式的协议。
- 计算机网络基本知识
- 协议:两台计算机通讯时对传送信息内容的理解、信息表示形式以及各种情况下应答信号都必须遵守的共同的约定。
- 体系结构:在一个计算机网络中将协议分成了若干层次,将协议按如何分层以及各层中具体采用协议的集合。
- OSI体系结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
- TCP/IP体系结构:网络接口层、网际层、运输层、应用层。
- HTTP1.0和HTTP1.1的区别
- 在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源;
- 在HTTP1.1协议中,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
- HTTP请求
- 请求行用于描述客户端的请求方式、请求的资源名称以及使用的HTTP协议版本号;
- 请求头用于描述客户端请求那台机器,以及客户端的一些环境信息等;
- 一个空行。
GET /books/java.html HTTP/1.1
Accept: */*
Accept-Language: en-us
Connection: Keep-Alive
Host: localhost
Referer: http://localhost/links.asp
User-Agent: Mozilla/4.0
Accept-Encoding: gzip, deflate
- 请求行
-
请求方式有POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT。默认情况下浏览器向服务器发送的都是GET请求。
-
GET请求在URL地址后附带的参数是有限制的,数据容量通常不超过1K;
-
POST请求传送的数据量无限制。
-
HTTP常用请求头:
Accept: text/html,image/* --支持数据类型
Accept-Charset: ISO-8859-1 --字符集
Accept-Encoding: gzip --支持压缩
Accept-Language:zh-cn --语言环境
Host: localhost:80 --访问主机
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT --缓存时间
Referer: http://localhost/index.jsp --来自哪个页面、防盗链
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie --使用的cookie
Connection: close/Keep-Alive --链接状态
Date: Tue, 11 Jul 2022 18:23:51 GMT --时间
- HTTP响应
-
一个HTTP响应代表服务器向客户端回送的数据。包括一个状态行、若干个响应头以及实体内容。
-
状态行用于描述服务器对请求的处理结果。
-
响应头用于描述服务器的基本信息,以及数据的描述。
HTTP/1.1 200 OK
Server: Microsoft-IIS/5.0
Date: Thu, 13 Jul 2000 05:46:53 GMT
Content-Length: 2291
Content-Type: text/html
Cache-control: private
<HTML>
<BODY>
......
- 状态行格式:HTTP版本号 状态码 原因描述
<CRLF>
。
状态码 | 含义 |
---|---|
1xx | 指示信息–表示请求已接收,继续处理 |
2xx | 成功–表示请求已被成功接收、理解、接受。200客户端请求成功 |
3xx | 重定向–要完成请求必须进行更进一步的操作 |
4xx | 客户端错误–请求有语法错误或请求无法实现。401请求未授权,403请求已收到但是拒绝提供服务,404请求资源不存在 |
5xx | 服务器端错误–服务器未能实现合法的请求。500服务器内部错误,503服务器不可用 |
- 常用响应头
Location: http://localhost/index.jsp --跳转方向
Server:apache tomcat --服务器型号
Content-Encoding: gzip --数据压缩
Content-Length: 80 --数据长度
Content-Language: zh-cn --语言环境
Content-Type: text/html; charset=GB2312 --编码
Last-Modified: Tue, 11 Jul 2022 18:23:51 GMT --最后修改时间
Refresh: 1;url=http://localhost --定时刷新
Content-Disposition: attachment; filename=aaa.zip --下载
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
Expires: -1 --缓存
Cache-Control: no-cache --缓存
Pragma: no-cache --缓存
Connection: close/Keep-Alive --连接
Date: Tue, 11 Jul 2022 18:23:51 GMT --时间
- 响应示例
public void test(HttpServeltRequest req, HttpServletResponse resp) {
//服务器通知浏览器跳转地址
resp.setHeader("location", "http://localhost:8080/1.html");
resp.setStatus(302);
//Content-Type服务器通知浏览器,服务器发送数据的编码
resp.setHeader("Content-Type", "text/html;charset=GB2312");
resp.getWriter().write("测试");
if (num >0) {
resp.getWriter().print(num--);
resp.setHeader("refresh", "1");
} else
resp.setHeader("refresh","0;url=http://localhost:8080/day4/2.html");
//Content-Type服务器通知浏览器,刷新时间及url
//response.setHeader("refresh", "2");
}
//通知浏览器数据格式为压缩格式
resp.setHeader("Content-Encoding", "gzip");
//测试数据:构建数据后压缩,再发送给浏览器
StringBuilder builder = new StringBuilder();
for (int i=0;i<100000;i++) builder.append("ab");
ByteArrayOutputStream bos = new ByteArrayOutputStream();
GZIPOutputStream gzip = new GZIPOutputStream(bos);
gzip.write(builder.toString().getBytes());
gzip.close();
byte[] resData = bos.toByteArray();
resp.getOutputStream().write(resData);
//下载
resp.setHeader("Content-Disposition", "attachment;filename=a.jpg");
InputStream is = this.getServletContext().getResourceAsStream("/1.jpg");
OutputStream out = resp.getOutputStream();
byte[] b = new byte[1024];
int len = -1;
while((len=in.read()) > -1) {
out.write(b, 0, len);
}
out.close();
is.close();
}