JavaWeb-HTTP协议

JavaWeb-HTTP协议

HTTP 概念

HTTP 协议一般指 HTTP(超文本传输协议)。

超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。

HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。

HTTP 工作原理

HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URLHTTP服务端WEB服务器发送所有请求。

Web服务器有:Apache服务器(我们常用的Tomcat),IIS服务器(Internet Information Services)等。

Web服务器根据接收到的请求后,向客户端发送响应信息。

HTTP默认端口号为80,但是你也可以改为8080或者其他端口。

HTTP三点注意事项

  • HTTP是无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
  • HTTP是媒体独立的:这意味着,只要客户端和服务器知道如何处理的数据内容,任何类型的数据都可以通过HTTP发送。客户端以及服务器指定使用适合的MIME-type内容类型。
  • HTTP是无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

以下图表展示了HTTP协议通信流程:
在这里插入图片描述

历史版本:

  • 1.0:每一次请求响应都会建立新的连接
  • 1.1:复用连接

HTTP 消息结构

请求消息:客户端发送给服务器端的数据

  • 请求行

    请求方式 请求url 请求协议/版本
    POST /login.html HTTP/1.1

    请求方式: Get Post Head Delete Put Tract …

    我们常用的有两种 Get和 POST

    • GET:请求参数在请求行中,在url后。请求能够携带的参数比较少,大小有限制,不安全,但高效
    • POST:请求参数在请求体中,不会再浏览器的URL地址栏显示数据内容,请求能够携带的参数没有限制,大小没有限制,安全,但不高效
  • 请求头:客户端浏览器告诉服务器一些信息

    请求头名称: 请求头值

    • User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息

      • 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
    • Referer:http://localhost/login.html

      • 告诉服务器,我(当前请求)从哪里来?
        • 防盗链
        • 统计工作
    • Host: localhost

      • 主机
    • Accept: text/html,application/xhtml+xml,application/xml;q=0.9,/;q=0.8

      • 告诉浏览器,它所支持的数据类型
    • Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2

      • 告诉浏览器,它的语言环境
    • Accept-Encoding: gzip, deflate

      • 支持哪种编码格式
    • Connection: keep-alive

      • 告诉浏览器,请求完成是断开连接还是保持连接
    • Cache-Control

      • 缓存控制
  • 请求空行

    空行,就是用于分割POST请求的请求头,和请求体的。

  • 请求体(正文):

    封装POST请求消息的请求参数的

响应消息:服务器端发送给客户端的数据

  • 响应行

    • 协议/版本 响应状态码 状态码描述

      HTTP/1.1 200 OK

    • 响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。

      • 状态码都是3位数字

      • 分类:

        • 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码

        • 2xx:成功。代表:200

        • 3xx:重定向。代表:302(重定向),304(访问缓存)

        • 4xx:客户端错误。

          代表:

          • 404(请求路径没有对应的资源)

          • 405:请求方式没有对应的doXxx方法

        • 5xx:服务器端错误。代表:500(服务器内部出现异常) 502(网关错误)

    • 参考链接

    响应状态码详解

    源码片段

     public void setStatus(int sc, String sm);
        
        /*
         * Server status codes; see RFC 2068.
         */
    
        /**
         * Status code (100) indicating the client can continue.
         */
    
        public static final int SC_CONTINUE = 100;
        
        /**
         * Status code (101) indicating the server is switching protocols
         * according to Upgrade header.
         */
    
        public static final int SC_SWITCHING_PROTOCOLS = 101;
    
        /**
         * Status code (200) indicating the request succeeded normally.
         */
    
        public static final int SC_OK = 200;
    
        /**
         * Status code (201) indicating the request succeeded and created
         * a new resource on the server.
         */
    
        public static final int SC_CREATED = 201;
    
        /**
         * Status code (202) indicating that a request was accepted for
         * processing, but was not completed.
         */
    
        public static final int SC_ACCEPTED = 202;
    
        /**
         * Status code (203) indicating that the meta information presented
         * by the client did not originate from the server.
         */
    
        public static final int SC_NON_AUTHORITATIVE_INFORMATION = 203;
    
        /**
         * Status code (204) indicating that the request succeeded but that
         * there was no new information to return.
         */
    
        public static final int SC_NO_CONTENT = 204;
    
        /**
         * Status code (205) indicating that the agent <em>SHOULD</em> reset
         * the document view which caused the request to be sent.
         */
    
        public static final int SC_RESET_CONTENT = 205;
    
        /**
         * Status code (206) indicating that the server has fulfilled
         * the partial GET request for the resource.
         */
    
        public static final int SC_PARTIAL_CONTENT = 206;
    
        /**
         * Status code (300) indicating that the requested resource
         * corresponds to any one of a set of representations, each with
         * its own specific location.
         */
    
        public static final int SC_MULTIPLE_CHOICES = 300;
    
        /**
         * Status code (301) indicating that the resource has permanently
         * moved to a new location, and that future references should use a
         * new URI with their requests.
         */
    
        public static final int SC_MOVED_PERMANENTLY = 301;
    
        /**
         * Status code (302) indicating that the resource has temporarily
         * moved to another location, but that future references should
         * still use the original URI to access the resource.
         *
         * This definition is being retained for backwards compatibility.
         * SC_FOUND is now the preferred definition.
         */
    
        public static final int SC_MOVED_TEMPORARILY = 302;
    
        /**
        * Status code (302) indicating that the resource reside
        * temporarily under a different URI. Since the redirection might
        * be altered on occasion, the client should continue to use the
        * Request-URI for future requests.(HTTP/1.1) To represent the
        * status code (302), it is recommended to use this variable.
        */
    
        public static final int SC_FOUND = 302;
    
        /**
         * Status code (303) indicating that the response to the request
         * can be found under a different URI.
         */
    
        public static final int SC_SEE_OTHER = 303;
    
        /**
         * Status code (304) indicating that a conditional GET operation
         * found that the resource was available and not modified.
         */
    
        public static final int SC_NOT_MODIFIED = 304;
    
        /**
         * Status code (305) indicating that the requested resource
         * <em>MUST</em> be accessed through the proxy given by the
         * <code><em>Location</em></code> field.
         */
    
        public static final int SC_USE_PROXY = 305;
    
         /**
         * Status code (307) indicating that the requested resource 
         * resides temporarily under a different URI. The temporary URI
         * <em>SHOULD</em> be given by the <code><em>Location</em></code> 
         * field in the response.
         */
    
         public static final int SC_TEMPORARY_REDIRECT = 307;
    
        /**
         * Status code (400) indicating the request sent by the client was
         * syntactically incorrect.
         */
    
        public static final int SC_BAD_REQUEST = 400;
    
        /**
         * Status code (401) indicating that the request requires HTTP
         * authentication.
         */
    
        public static final int SC_UNAUTHORIZED = 401;
    
        /**
         * Status code (402) reserved for future use.
         */
    
        public static final int SC_PAYMENT_REQUIRED = 402;
    
        /**
         * Status code (403) indicating the server understood the request
         * but refused to fulfill it.
         */
    
        public static final int SC_FORBIDDEN = 403;
    
        /**
         * Status code (404) indicating that the requested resource is not
         * available.
         */
    
        public static final int SC_NOT_FOUND = 404;
    
        /**
         * Status code (405) indicating that the method specified in the
         * <code><em>Request-Line</em></code> is not allowed for the resource
         * identified by the <code><em>Request-URI</em></code>.
         */
    
        public static final int SC_METHOD_NOT_ALLOWED = 405;
    
        /**
         * Status code (406) indicating that the resource identified by the
         * request is only capable of generating response entities which have
         * content characteristics not acceptable according to the accept
         * headers sent in the request.
         */
    
        public static final int SC_NOT_ACCEPTABLE = 406;
    
        /**
         * Status code (407) indicating that the client <em>MUST</em> first
         * authenticate itself with the proxy.
         */
    
        public static final int SC_PROXY_AUTHENTICATION_REQUIRED = 407;
    
        /**
         * Status code (408) indicating that the client did not produce a
         * request within the time that the server was prepared to wait.
         */
    
        public static final int SC_REQUEST_TIMEOUT = 408;
    
        /**
         * Status code (409) indicating that the request could not be
         * completed due to a conflict with the current state of the
         * resource.
         */
    
        public static final int SC_CONFLICT = 409;
    
        /**
         * Status code (410) indicating that the resource is no longer
         * available at the server and no forwarding address is known.
         * This condition <em>SHOULD</em> be considered permanent.
         */
    
        public static final int SC_GONE = 410;
    
        /**
         * Status code (411) indicating that the request cannot be handled
         * without a defined <code><em>Content-Length</em></code>.
         */
    
        public static final int SC_LENGTH_REQUIRED = 411;
    
        /**
         * Status code (412) indicating that the precondition given in one
         * or more of the request-header fields evaluated to false when it
         * was tested on the server.
         */
    
        public static final int SC_PRECONDITION_FAILED = 412;
    
        /**
         * Status code (413) indicating that the server is refusing to process
         * the request because the request entity is larger than the server is
         * willing or able to process.
         */
    
        public static final int SC_REQUEST_ENTITY_TOO_LARGE = 413;
    
        /**
         * Status code (414) indicating that the server is refusing to service
         * the request because the <code><em>Request-URI</em></code> is longer
         * than the server is willing to interpret.
         */
    
        public static final int SC_REQUEST_URI_TOO_LONG = 414;
    
        /**
         * Status code (415) indicating that the server is refusing to service
         * the request because the entity of the request is in a format not
         * supported by the requested resource for the requested method.
         */
    
        public static final int SC_UNSUPPORTED_MEDIA_TYPE = 415;
    
        /**
         * Status code (416) indicating that the server cannot serve the
         * requested byte range.
         */
    
        public static final int SC_REQUESTED_RANGE_NOT_SATISFIABLE = 416;
    
        /**
         * Status code (417) indicating that the server could not meet the
         * expectation given in the Expect request header.
         */
    
        public static final int SC_EXPECTATION_FAILED = 417;
    
        /**
         * Status code (500) indicating an error inside the HTTP server
         * which prevented it from fulfilling the request.
         */
    
        public static final int SC_INTERNAL_SERVER_ERROR = 500;
    
        /**
         * Status code (501) indicating the HTTP server does not support
         * the functionality needed to fulfill the request.
         */
    
        public static final int SC_NOT_IMPLEMENTED = 501;
    
        /**
         * Status code (502) indicating that the HTTP server received an
         * invalid response from a server it consulted when acting as a
         * proxy or gateway.
         */
    
        public static final int SC_BAD_GATEWAY = 502;
    
        /**
         * Status code (503) indicating that the HTTP server is
         * temporarily overloaded, and unable to handle the request.
         */
    
        public static final int SC_SERVICE_UNAVAILABLE = 503;
    
        /**
         * Status code (504) indicating that the server did not receive
         * a timely response from the upstream server while acting as
         * a gateway or proxy.
         */
    
        public static final int SC_GATEWAY_TIMEOUT = 504;
    
        /**
         * Status code (505) indicating that the server does not support
         * or refuses to support the HTTP protocol version that was used
         * in the request message.
         */
    
        public static final int SC_HTTP_VERSION_NOT_SUPPORTED = 505;
    }
    
  • 响应头:

    • 头名称: 值
    • 常见的响应头:
      • Content-Type:类型
      • Content-disposition:服务器告诉客户端以什么格式打开响应体数据
      • Cache-Controll : 缓存控制
      • Connection: keep-Alive 连接
      • Content-Encoding :gzip 编码
  • 响应空行

  • 响应体:传输的数据

    • Accept
      • 告诉浏览器,它所支持的数据类型
    • Accept-Language
      • 告诉浏览器,它的语言环境
    • Accept-Encoding
      • 支持哪种编码格式
    • Connection
      • 告诉浏览器,请求完成是断开连接还是保持连接
    • Cache-Control
      • 缓存控制
    • Host: localhost
      • 主机
    • Refresh
      • 告诉客户端,多久刷新一次
    • Location
      • 让网页重新定位
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

野猫爱吃鱼

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值