zoukankan      html  css  js  c++  java
  • HTTP



    1.1   HTTP协议

    HTTPhypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。

     

    目前存在两个版本:HTTP 1.0 / HTTP/1.1

    HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。

    HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源

     

    HTTP/1.1 -> https://tools.ietf.org/html/rfc2616

     

    1.1.1     HTTP请求

    客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求。

    一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、一个空行、以及实体内容

     

    111

     

    1.1.1.1  请求行(Request-Line)

    描述客户端的请求方式、请求的资源名称、使用的HTTP协议版本,格式

     

    Method SP Request-URI SP HTTP-Version CRLF

     

    解析

    2012072810301161

     

     

    请求行中请求方式(Method): POSTGETHEADOPTIONSDELETETRACEPUT。常用的GETPOST。默认情况下,浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get。如果想通过post发送请求,可以通过HTML表单实现。

     

    不管POSTGET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:

    如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /uc/loginService?name=abc&password=xyz HTTP/1.1

    GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K

      

    如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。

    例如: uuid=xxx&fp=74023c0cb7692c704cdca39d0f5a7c0a&_t=_t&loginType=c&loginname=18620019538&nloginpwd=xxx&pubKey=xxx&sa_token=xxx&seqSid=235687348279160016&useSlideAuthCode=1

    1.1.1.2  请求消息头(Request Header Fields)

    Accept:浏览器通过这个头告诉服务器,它所支持的数据类型

    Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集

    Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式

    Accept-Language:浏览器通过这个头告诉服务器,它的语言环境

    Host:浏览器通过这个头告诉服务器,想访问哪台主机

    If-Modified-Since:浏览器通过这个头告诉服务器,缓存数据的时间

    Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链

    Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接。close表示使用短连接,Keep-Alive表示客户端支持持久连接。

    User-Agent:用户代理,也即用户的浏览器类型信息

    If-None-Match:用于标记ETag的值

     

    1.2   HTTP响应

    一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、一个空行、以及实体内容

    22

     

    1.2.1.1  状态行(Status-Line)

    状态行用于描述对服务器请求的处理结果。语法

    Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF

     

    e.g: HTTP/1.1 200 OK

     

    状态码

     

    描述

    100-199

    1xx

    表示成功接收请求,要求客户端继续提交下一次请求才能完成整个处理过程。

    200-299

    2xx

    表示成功接收请求并已完成整个处理过程。e.g:200

    300-399

    3xx

    为完成请求,客户需进一步细化请求。例如:请求的资源以及移动到一个新地址,此时服务器可告知客户端去哪里找(重定向)e.g:302(Found 资源找到,但在其他位置)

    400-499

    4xx

    客户端的请求有错误。e.g:404(Not Found文件不存在)

    500-500

    5xx

    服务器内部错误。e.g:500(Internal Server Error 服务器内部错误)

     

    详细参考: 6.1.1 Status Code and Reason Phrase

     

    1.2.1.2  响应头(Response Header Fields)

    HTTP响应中的常用响应头(消息头)

    Location: 服务器通过这个头,来告诉浏览器跳到哪里

    Server:服务器通过这个头,告诉浏览器服务器的型号

    Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式

    Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度

    Content-Language: 服务器通过这个头,告诉浏览器语言环境

    Content-Type:服务器通过这个头,告诉浏览器回送数据的类型

    Refresh:服务器通过这个头,告诉浏览器定时刷新

    Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据

    Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的

    Expires: -1  控制浏览器资源缓冲时间

    Cache-Control: 控制浏览器资源资源是否缓冲

    Pragma: 控制浏览器资源资源是否缓冲

     

    1.3   测试HTTP协议

    win下可以通过telnet测试http协议工作细节.

    import java.io.IOException;
    import java.io.PrintWriter;
    import java.io.Writer;
    
    import javax.servlet.ServletException;
    import javax.servlet.ServletOutputStream;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    @WebServlet("/test00")
    public class Test00Servlet extends HttpServlet {
        private static final long serialVersionUID = 1L;
    
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            response.setHeader("Content-Type", "text/html;charset=UTF-8");
            PrintWriter writer = response.getWriter();
            writer.write("<html>");
            writer.write("<body>");
            writer.write("Hello World!");
            writer.write("</body>");
            writer.write("</html>");
    
            writer.flush();
            writer.close();
    
        }
    
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
    
            String user = request.getParameter("uname");
            String pwd = request.getParameter("pwd");
    
            response.setHeader("Content-Type", "text/html;charset=UTF-8");
            response.setCharacterEncoding("UTF-8");
            
            // 指定长度后,httpwatch/telnet不会出现多余字符
            // response.setIntHeader("Content-Length", 51);
            
            PrintWriter writer = response.getWriter();
            writer.write("<!doctype html>");
            writer.write("<html>");
            writer.write("<body>");
            writer.write(user + "=>" + pwd);
            writer.write("</body>");
            writer.write("</html>");
            
            // 注释后,httpwatch/telnet不会出现多余字符
            writer.flush();
            writer.close();
    
            
            // 以下方式响应信息中不会出现多余控制字符
            /*
            ServletOutputStream out = response.getOutputStream();
            String str = "<!doctype html><html><body>"+user+"=>"+pwd+"</body></html>";
            byte[] buf = str.getBytes("UTF-8");
            response.setIntHeader("Content-Length", buf.length);
            out.write(buf);
    
            out.flush();
            out.close();
            */
            
        }
    
    }

    1.3.1     测试GET请求

    >telnet 127.0.0.1 8080

    > 输入 ctrl+] 启用回显

    clip_image008[9]

    进入编辑模式

     

     

     

     

    贴入以下HTTP请求信息:

    GET /javaee-01-http/test00 HTTP/1.1

    connection: close

    Host:127.0.0.1

     

     

    注意:最后两行是两个空行,且必须输入。依照HTTP请求格式:

    请求行 =>  GET /javaee-01-http/test00 HTTP/1.1

    请求头 =>  connection: close

    请求头 =>  Host:127.0.0.1

    空行   => 

    clip_image010[9]

     

    请求完成后得到响应头

    状态行   => HTTP/1.1 200 OK

    响应头   =>| Server: Apache-Coyote/1.1

               | Content-Type: text/html;charset=UTF-8

               | Content-Length: 38

               | Date: Thu, 06 Jun 2019 07:36:28 GMT

               | Connection: close

    空行     =>

    响应实体 => <html><body>Hello World!</body></html>

     

    1.3.2     测试POST请求

    通过telnet发送表单数据,发送端的请求表单信息如下

    POST /javaee-01-http/test00 HTTP/1.1

    Host: 127.0.0.1:8080

    Connection: keep-alive

    content-length: 19

    Content-Type: application/x-www-form-urlencoded

     

    uname=admin&pwd=123

     

     

    响应信息

    HTTP/1.1 200 OK

    Server: Apache-Coyote/1.1

    Content-Type: text/html;charset=UTF-8

    Transfer-Encoding: chunked

    Date: Thu, 06 Jun 2019 09:07:22 GMT

     

    33

    <!doctype html><html><body>admin=>123</body></html>

    0

     

    clip_image012[9]

    clip_image014[9]

     

    330等多余字符疑是控制字符,这些控制字符对浏览器等解析无影响。在Test00Servlet中已提供解决方法。

  • 相关阅读:
    IbatisNet 快速开发使用 之一
    C#开发和调用Web Service
    如何构建银行数据仓库
    SQLSREVER如何创建和使用动态游标
    一个sql语句,包含有几乎所有标准查询语法
    深入研究SQL结构化查询语言中的LIKE语句
    数据库正规化和设计技巧
    黑客攻破SQL服务器系统的十种方法
    实用的存储过程
    数据库人员手边系列:SQL Server常见连接错误
  • 原文地址:https://www.cnblogs.com/geeta/p/10984299.html
Copyright © 2011-2022 走看看