欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Http 协议详解 学习笔记

程序员文章站 2022-04-23 16:55:38
...


本文查阅方法:
    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请求包括如下内容:

 

  一个请求行、若干消息头、以及实体内容,如下所示 :

 


Http 协议详解  学习笔记
            
    
    博客分类: 学习笔记 httpGETPOST状态码消息头 
 

 


 

  

 

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响应代表服务器向客户端回送的数据,它包括:

 

    一个状态行、若干消息头、以及实体内容 。 

 

 

Http 协议详解  学习笔记
            
    
    博客分类: 学习笔记 httpGETPOST状态码消息头 
 

 

 

 


 

 

 

8、HTTP响应的细节——状态行

 

    状态行

 

      格式: HTTP版本号 状态码 原因叙述<CRLF>

 

      举例:HTTP/1.1 200 OK

 

    状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:

 


Http 协议详解  学习笔记
            
    
    博客分类: 学习笔记 httpGETPOST状态码消息头 
 

 

 

 


 

 

 

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();

 

      } 

 

    }

 


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Http 协议详解  学习笔记
            
    
    博客分类: 学习笔记 httpGETPOST状态码消息头 
  • 大小: 57.5 KB
  • Http 协议详解  学习笔记
            
    
    博客分类: 学习笔记 httpGETPOST状态码消息头 
  • 大小: 58.4 KB
  • Http 协议详解  学习笔记
            
    
    博客分类: 学习笔记 httpGETPOST状态码消息头 
  • 大小: 77.9 KB