本文查阅方法:
1、查阅目录 —— 查阅本文目录,确定想要查阅的目录标题
2、快捷“查找” —— 在当前浏览器页面,按键 “Ctrl+F” 按键组合,开启浏览器的查找功能,
在查找搜索框中 输入需要查阅的 目录标题,便可以直接到达 标题内容 的位置。
3、学习小结 —— 文中的学习小结内容,是笔者在学习之后总结出的,开发时可直接参考其进行应用
开发的内容, 进一步加快了本文的查阅 速度。(水平有限,仅供参考。)
本文目录
学习小结
1、什么是HTTP协议
2、HTTP协议简介
3、HTTP1.0和HTTP1.1的区别
4、HTTP请求 概述
5、HTTP请求的细节——请求行
6、HTTP请求的细节——常用消息头
7、HTTP响应 概述
8、HTTP响应的细节——状态行
9、HTTP响应细节——常用响应头
10、Http请求常用响应头信息范例Demo
11、HTTP其他实用头字段及其Demo
学习小结
(1)HTTP请求:请求行常用两种请求方式:
a. Get方式:数据在URL地址后以“?”的形式附带,多个数据用“&”分隔,数据容量小于1k;
b. Post方式:数据在 实体 部分, 数据容量无限制。
(2)HTTP请求常用消息头及Demo
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.it315.org/index.jsp
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie:
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
(3)HTTP响应:状态行 常用状态码
200:请求响应正常;
302:要浏览器去找响应群殴Location头信息所标注的资源;
304/307:要浏览器去拿浏览器缓存数据;
404:找不到资源,建议检查访问路径;
500:服务器处理访问时,出现问题,无法响应。
(4)HTTP响应常用消息头及Demo
Location: http://www.sina .org/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 2000 18:23:51 GMT
Refresh: 1;url=http://www.sina.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag: W/"7777-1242234904000"
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
1、什么是HTTP协议
HTTP协议用于定义客户端与web服务器通迅的格式。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议就是用于定义通迅格式的协议。
【技巧:安装IE浏览器插件HttpWatch,查看IE浏览器通过HTTP协议获取某个页面。可以使用telnet程序连上web服务器,并使用HTTP协议获取某个页面,快速了解 HTTP协议的作用。】
2、HTTP协议简介
HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。
HTTP协议是学习JavaWEB开发的基石,不深入了解HTTP协议,就不能说掌握了WEB开发,更无法管理和维护一些复杂的WEB站点。
HTTP协议的版本:HTTP/1.0、HTTP/1.1
3、HTTP1.0和HTTP1.1的区别
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
在HTTP1.1协议中,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。
使用telnet举例说明。
命令行:telnet localhost 8080
【小知识:Telnet默认不回显数据,需要按键“Ctrl+]”,再按回车键,就会启动数据回显,就可以看到输入的字符】
问题:一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求。(4次)
【小知识:页面优化技术原则之一:尽量减少浏览器请求资源的次数】
4、HTTP请求 概述
客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。一个完整的HTTP请求包括如下内容:
一个请求行、若干消息头、以及实体内容,如下所示 :
5、HTTP请求的细节——请求行
请求行中的GET称之为请求方式,请求方式有七种:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT。而常用的有两种: GET 方式、 POST 方式。用户如没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:
a.如请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,
多个数据之间以&进行分隔,例如: GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
b.如请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据.
Post方式的特点:传送的数据量无限制。
6、HTTP请求的细节——常用消息头
用于HTTP请求中的常用头:告诉服务器,浏览器的当前工作环境信息。
Demo样例:
Accept: text/html,image/*
Accept-Charset: ISO-8859-1
Accept-Encoding: gzip,compress
Accept-Language: en-us,zh-cn
Host: www.it315.org:80
If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT
Referer: http://www.it315.org/index.jsp
User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0)
Cookie:
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
请求头详解:
Accept: 用于告诉服务器,客户机所支持的数据类型
Accept-Charset: 用于告诉服务器,客户机所采用的码表
Accept-Encoding: 用于告诉服务器,客户机所支持的数据压缩格式
Accept-Language: 用于告诉服务器,客户机的语言环境
Host: 用于告诉服务器,客户机想访问服务器哪台主机
If-Modified-Since: 用于告诉服务器,客户机对于资源的最后缓存时间,精确到秒级。
Referer: 用于告诉服务器,客户机是从哪个页面去访问服务器的 (防盗链)
User-Agent: 用于告诉服务器,客户机的机器环境(例如所使用的操作系统,浏览器版本号)
Cookie:客户端通过这个头字段,可以带一些数据给服务器
Connection:客户端通过这个头字段告诉服务器,请求完成后,是保持链接还是关闭链接
7、HTTP响应 概述
一个HTTP响应代表服务器向客户端回送的数据,它包括:
一个状态行、若干消息头、以及实体内容 。
8、HTTP响应的细节——状态行
状态行
格式: HTTP版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:
9、HTTP响应细节——常用响应头
HTTP请求中的常用响应头
Demo样例:
Location: http://www.sina .org/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 2000 18:23:51 GMT
Refresh: 1;url=http://www.sina.org
Content-Disposition: attachment; filename=aaa.zip
Transfer-Encoding: chunked
Set-Cookie:SS=Q0=5Lb_nQ; path=/search
ETag: W/"7777-1242234904000"
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
Connection: close/Keep-Alive
Date: Tue, 11 Jul 2000 18:23:51 GMT
响应头详解
Location:这个头通常配合302状态码使用,服务器使用这个头告诉浏览器去找谁【范例见Demo1】
Server:服务器通过这个头告诉浏览器,服务器的类型
Content-Encoding: 服务器通过这个头告诉浏览器,数据的压缩格式(gzip) 【范例见Demo2】
一定要压缩服务器返回数据,既可提升服务器性能,又可大大减少服务器网络流量费用
Content-Length:服务器通过这个头告诉浏览器,回送数据的长度【范例见Demo2】
Content-Language: 服务器通过这个头告诉浏览器,回送数据的语言;
Content-Type: 服务器通过这个头告诉浏览器,回送数据的类型【范例见Demo3】
对于响应返回图片、视频、音频等数据类型时,很重要。
Last-Modified: 服务器通过这个头告诉浏览器,数据的最后修改时间,精确到秒级。
Refresh:服务器 告诉浏览器,多长时间定时刷新或定时转向其他页面 (论坛刷新)【范例见Demo4】
Content-Disposition: 控制浏览器以下载方式打开回送的数据【范例见Demo5】
对于响应返回图片、视频、音频等数据类型时,可能会用到。
Transfer-Encoding: 服务器通过这个头告诉浏览器,数据是以块方式回送的(用的少)
Expires:控制浏览器缓存数据的时间(-1或0,代表控制浏览器不要缓存)
时间+数据:保存该数据缓存的时间,eg:2012 12 12 (1.html)
Cache-Control: no-cache
Pragma: no-cache
以上三个头一起用,就可以控制所有的浏览器不要缓存数据
ETag:缓存相关,服务器给每一个网页都生成一个编码,用来进行比对,以配合304或307通知浏览器是否使用缓存的数据,精确到毫秒级。(一般的服务器不需要这么严谨)
10、Http请求常用响应头信息范例Demo
public class ServletDemo1 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
test5(response);
}
【范例Demo1:Location 】
//指示浏览器重新定向
public void test1(HttpServletResponse response){
response.setStatus(302);
response.setHeader("location", "/day04/index.jsp");
}
【范例Demo2:Content-Encoding 】
// 演示数据压缩
public void test2(HttpServletResponse response) throws IOException{
String data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; //数据太小可能会压缩后反而更大,当数据大时压缩效果才显著。
System.out.println("原始数据的大小:" + data.getBytes().length);
//下面代码是压缩数据。GZIPOutputStream 是JDK自带的gzip压缩工具类,需要将数据写入流中
ByteArrayOutputStream bout = new ByteArrayOutputStream();
GZIPOutputStream gout = new GZIPOutputStream(bout);
gout.write(data.getBytes());
gout.close();
byte gzipData[] = bout.toByteArray(); //获得gzip压缩后的数据
response.setHeader("Content-Encoding", "gzip"); //告诉浏览器压缩数据的格式
response.setHeader("content-length", gzipData.length+""); //数据大小
response.getOutputStream().write(gzipData); //返回浏览器
}
【范例Demo3:Content-Type 】
//content-type头字段的作用
public void test3(HttpServletResponse response) throws IOException{
String path = this.getServletContext().getRealPath("/02.jpg");
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
response.setHeader("content-type", "image/jpeg");//此语句要在写数据前执行
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
【范例Demo4:Refresh 】
//控制浏览器定时刷新
public void test4(HttpServletResponse response) throws IOException{
response.setHeader("refresh", "3;url='http://www.sina.com'");
response.getWriter().write("你的页面 3 秒钟后将会转向新浪首页");
}
【范例Demo5:Content-Disposition 】
//控制浏览器下载
public void test5(HttpServletResponse response) throws IOException{
response.setHeader("content-disposition", "attachment;filename=02.jpg");
String path = this.getServletContext().getRealPath("/01.jpg");
FileInputStream in = new FileInputStream(path);
byte buffer[] = new byte[1024];
int len = 0;
OutputStream out = response.getOutputStream();
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
out.close();
in.close();
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
11、HTTP其他实用头字段 及其Demo
HTTP请求头字段
Range头指示服务器只传输一部分Web资源。这个头可以用来实现断点续传功能。
Range字段可以通过三种格式设置要传输的字节范围:
Range: bytes=1000-2000 : 传输范围从1000到2000字节。
Range: bytes=1000- : 传输Web资源中第1000个字节以后的所有内容。
Range bytes=1000 : 传输最后1000个字节。
由于浏览器并不支持该头字段,所以需要自己写客户端程序来实现该字段的功能。
HTTP响应消息头字段
Accept-Ranges:这个字段说明Web服务器是否支持Range,
支持则返回Accept-Ranges: bytes,
如果不支持,则返回Accept-Ranges: none.
Content-Range:指定了返回的Web资源的字节范围。这个字段值的格式是:
例子: Content-Range:1000-3000/5000
Demo样例:
public class DownLoad {
public static void main(String[] args) throws Exception {
URL url = new URL("http://localhost:8080/day04/1.txt");
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setRequestProperty("Range", "bytes=6-");
FileOutputStream out = new FileOutputStream("c:\\1.txt",true);
InputStream in = conn.getInputStream();
int len = 0;
byte buffer[] = new byte[1024];
while((len=in.read(buffer))>0){
out.write(buffer, 0, len);
}
in.close();
out.close();
}
}
相关推荐
TCPIP协议详解学习笔记.pdf
TCP/IP详解学习笔记主要涵盖了网络通信的基础概念和TCP/IP协议族的核心内容。TCP/IP协议是为了克服计算机之间因操作系统和表达信息方式的差异而导致的沟通难题而诞生的,它是一个协议族,包含了众多协议,如IP、ICMP...
LwIP编程指南LwIP协议详解lwip学习笔记IP+LWIP移植实现等相关资料12个合集: IP+LWIP移植实现.pdf Lwip.doc LWIP中文.pdf LwIP协议栈源码详解.pdf LwIP协议栈的设计与实现_中文译稿.pdf LwIP协议详解.pdf lwip学习...
"TCPIP详解学习笔记" TCP/IP 协议族是一个协议族的统称,包括了 IP 协议、ICMP 协议、TCP 协议、UDP 协议、DNS 协议等等。TCP/IP 协议族按照层次由上到下,层层包装。最上面的就是应用层了,这里面有 http、ftp ...
"TCP/IP 详解学习笔记" TCP/IP 协议是计算机网络中最重要的协议族之一,它为计算机之间的通信提供了标准的语言。TCP/IP 协议族包括了 IP 协议、IMCP 协议、TCP 协议,以及我们更加熟悉的 HTTP、FTP、POP3 协议等等...
### VC++深入详解学习笔记知识点概述 #### 一、Windows程序运行原理及程序编写流程 - **窗口产生过程**:Windows程序的核心在于窗口的管理和消息处理。窗口是应用程序与用户交互的基本单位,它包含了客户区(用户...
### HTTP协议学习笔记之C++ #### 一、HTTP协议基础 HTTP(Hypertext Transfer Protocol)是一种应用层协议,主要用于客户端(例如Web浏览器)与服务器之间的数据交换。它基于TCP/IP协议栈,利用TCP来确保数据传输...
TCP/IP详解的学习笔记涵盖了IP协议的关键概念和技术细节。IP,即网际协议,是互联网通信的基础,具有不可靠和无连接的特点。不可靠意味着IP不保证数据报能成功到达目的地,错误时会丢弃数据包并发送ICMP消息。可靠性...
这篇文档主要是针对TCP/IP的协议进行详细的介绍,有笔者的学习心得!
SPI-note.pdf和S12SPIV3.pdf可能包含了更深入的SPI协议详解,例如SPI的工作流程、具体操作步骤、如何配置SPI控制器、如何编写SPI驱动程序、以及在实际应用中如何优化SPI通信性能等内容。通过阅读这些文档,你可以对...
在"RapidIO学习笔记"中,我们可以深入探讨以下几个关键知识点: 1. **协议层次结构**:RapidIO协议分为物理层(PHY)、串行链路层(SLL)和传输层(TL)。物理层处理实际的信号传输,串行链路层负责将并行数据转换...
### 知识点生成 ...以上是基于《VC++深入详解》学习笔记中的各章节内容所提炼出的主要知识点。通过对这些知识点的学习,读者可以全面了解VC++编程的相关技术和实践方法,为进一步深入研究打下坚实的基础。
文档的作者是老宰五木,他通过个人的博客分享自己的学习笔记。从文档内容来看,作者从事与LwIP相关的项目,并在项目实践中积累了丰富的经验。作者在文档中提到了自己的写作动机,以及在撰写过程中所遇到的挑战,包括...
USB(Universal Serial Bus)协议详解 USB协议是计算机与外部设备之间进行数据传输的一种标准,它的全称为“通用串行总线”。自1996年首次推出以来,USB已经经历了多个版本的迭代,从USB 1.0到最新的USB 4,其速度...