JavaWeb-HTTP协议
HTTP 概念
HTTP 协议一般指 HTTP(超文本传输协议)。
超文本传输协议(英语:HyperText Transfer Protocol,缩写:HTTP)是一种用于分布式、协作式和超媒体信息系统的应用层协议,是因特网上应用最为广泛的一种网络传输协议,所有的 WWW 文件都必须遵守这个标准。
HTTP是一个基于TCP/IP通信协议来传递数据(HTML 文件, 图片文件, 查询结果等)。
HTTP 工作原理
HTTP协议工作于客户端-服务端架构上。浏览器作为HTTP客户端通过URL向HTTP服务端即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
- 让网页重新定位
- Accept