HTTP协议(一)

HTTP协议(一)

  1. 什么是HTTP协议
  • 客户端连上web服务器后,如果想要获得web服务器中的某个web资源,需要遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器之间通讯的格式;
  • 基于TCP连接的传输协议;
  • 默认端口是80;
  • 基于请求响应模式的协议。
  1. 计算机网络基本知识
  • 协议:两台计算机通讯时对传送信息内容的理解、信息表示形式以及各种情况下应答信号都必须遵守的共同的约定。
  • 体系结构:在一个计算机网络中将协议分成了若干层次,将协议按如何分层以及各层中具体采用协议的集合。
  • OSI体系结构:物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。
  • TCP/IP体系结构:网络接口层、网际层、运输层、应用层。
  1. HTTP1.0和HTTP1.1的区别
  • 在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源;
  • 在HTTP1.1协议中,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
  1. 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

  1. 请求行
  • 请求方式有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	--时间
  1. 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		--时间
  1. 响应示例
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();
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

快乐江小鱼

知识创造财富,余额还是小数

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

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

打赏作者

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

抵扣说明:

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

余额充值