HTTP协议 #
超文本传输协议(hypertext transport protocol),服务端和客户端发送数据,需要遵守的协议,传递的数据又称为报文
HTTP协议的特点 #
1、HTTP协议是基于TCP/IP通信协议来传递数据(HTML文件,图片文件,查询结果等)
2、HTTP协议的默认端口号是80
3、HTTP协议是基于请求和响应的模式的协议,一次请求对应一次响应
4、HTTP协议是一种无连接协议,两次请求之间没有任何关系,互相不干涉
工作原理 #
1、HTTP协议工作于客户端-服务端架构上,浏览器作为HTTP客户端通过URL向HTTP服务器(Web服务器)发送所有请求。
2、Web根据接收到的请求,向客户端发送响应信息
HTTP注意事项 #
1、HTTP是无连接的:每次连接只处理一个请求
2、HTTP是媒体独立的:任何类型的数据都可以通过HTTP发送,只要告诉服务器就可以
3、HTTP是无状态的:对于事务处理没有记忆功能,意味着如果后续的处理需要前面的信息,就必须重新传输
HTTP消息结构 #
请求消息结构 #
请求行(request line) #
- 格式:请求方法 URI 协议版本
GET /day27/servletDemo1?username=tom HTTP/1.1
请求方法 #
HTTP1.0 定义了三种请求方法: GET, POST 和 HEAD 方法。
HTTP1.1 新增了六种请求方法:OPTIONS、PUT、PATCH、DELETE、TRACE 和 CONNECT 方法。
| 方法 | 描述 |
|---|---|
| GET | 请求指定的页面信息,并返回实体主体。 |
| HEAD | 类似于 GET 请求,只不过返回的响应中没有具体的内容,用于获取报头 |
| POST | 向指定资源提交数据进行处理请求(例如提交表单或者上传文件)。数据被包含在请求体中。POST 请求可能会导致新的资源的建立和/或已有资源的修改。 |
| PUT | 从客户端向服务器传送的数据取代指定的文档的内容。 |
| DELETE | 请求服务器删除指定的数据。 |
| CONNECT | HTTP/1.1 协议中预留给能够将连接改为管道方式的代理服务器。 |
| OPTIONS | 允许客户端查看服务器的性能。 |
| TRACE | 回显服务器收到的请求,主要用于测试或诊断。 |
| PATCH | 是对 PUT 方法的补充,用来对已知资源进行局部更新 。 |
请求头部(header) #
格式:请求消息头:请求消息值 回车符 换行符
key :value\r\n
| key | 说明 | 举例 |
|---|---|---|
| Accept | 设置接受的内容类型 | Accept: text/plain |
| Accept-Charset | 设置接受的字符编码 | Accept-Charset: utf-8 |
| Accept-Encoding | 设置接受的编码格式 | Accept-Encoding: gzip, deflate |
| Accept-Datetime | 设置接受的版本时间 | Accept-Datetime: Thu, 31 May 2007 20:35:00 GMT |
| Accept-Language | 设置接受的语言 | Accept-Language: en-US |
| Authorization | 设置HTTP身份验证的凭证 | Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Cache-Control | 设置请求响应链上所有的缓存机制必须遵守的指令 | Cache-Control: no-cache |
| Connection | 设置当前连接和hop-by-hop协议请求字段列表的控制选项 | Connection: keep-alive Connection: Upgrade |
| Content-Length | 设置请求体的字节长度 | Content-Length: 348 |
| Content-MD5 | 设置基于MD5算法对请求体内容进行Base64二进制编码 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
| Content-Type | 设置请求体的MIME类型(适用POST和PUT请求) | Content-Type: application/x-www-form-urlencoded |
| Cookie | 设置服务器使用Set-Cookie发送的http cookie | Cookie: $Version=1; Skin=new; |
| Date | 设置消息发送的日期和时间 | Date: Tue, 15 Nov 1994 08:12:31 GMT |
| Expect | 标识客户端需要的特殊浏览器行为 | Expect: 100-continue |
| Forwarded | 披露客户端通过http代理连接web服务的源信息 | Forwarded: for=192.0.2.60;proto=http;by=203.0.113.43 Forwarded: for=192.0.2.43, for=198.51.100.17 |
| From | 设置发送请求的用户的email地址 | From: user@example.com |
| Host | 设置服务器域名和TCP端口号,如果使用的是服务请求标准端口号,端口号可以省略 | Host: en.wikipedia.org:8080 Host: en.wikipedia.org |
| If-Match | 设置客户端的ETag,当时客户端ETag和服务器生成的ETag一致才执行,适用于更新自从上次更新之后没有改变的资源 | If-Match: “737060cd8c284d8af7ad3082f209582d |
| If-Modified-Since | 设置更新时间,从更新时间到服务端接受请求这段时间内如果资源没有改变,允许服务端返回304 Not Modified | If-Modified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
| If-None-Match | 设置客户端ETag,如果和服务端接受请求生成的ETage相同,允许服务端返回304 Not Modified | If-None-Match: “737060cd8c284d8af7ad3082f209582d” |
| If-Range | 设置客户端ETag,如果和服务端接受请求生成的ETage相同,返回缺失的实体部分;否则返回整个新的实体 | If-Range: “737060cd8c284d8af7ad3082f209582d” |
| If-Unmodified-Since | 设置更新时间,只有从更新时间到服务端接受请求这段时间内实体没有改变,服务端才会发送响应 | If-Unmodified-Since: Sat, 29 Oct 1994 19:43:31 GMT |
| Max-Forwards | 限制代理或网关转发消息的次数 | Max-Forwards: 10 |
| Origin | 标识跨域资源请求(请求服务端设置Access-Control-Allow-Origin响应字段) | Origin: http://www.example-social-network.com |
| Pragma | 设置特殊实现字段,可能会对请求响应链有多种影响 | Pragma: no-cache |
| Proxy-Authorization | 为连接代理授权认证信息 | Proxy-Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ== |
| Range | 请求部分实体,设置请求实体的字节数范围,具体可以参见HTTP/1.1中的Byte serving | Range: bytes=500-999 |
| Referer | 设置前一个页面的地址,并且前一个页面中的连接指向当前请求,意思就是如果当前请求是在A页面中发送的,那么referer就是A页面的url地址(轶事:这个单词正确的拼法应该是"referrer”,但是在很多规范中都拼成了"referer",所以这个单词也就成为标准用法) | Referer: http://en.wikipedia.org/wiki/Main_Page |
| TE | 设置用户代理期望接受的传输编码格式,和响应头中的Transfer-Encoding字段一样 | TE: trailers, deflate |
| Upgrade | 请求服务端升级协议 | Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocket |
| User-Agent | 用户代理的字符串值 | User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:12.0) Gecko/20100101 Firefox/21.0 |
| Via | 通知服务器代理请求 | Via: 1.0 fred, 1.1 example.com (Apache/1.1) |
| Warning | 实体可能会发生的问题的通用警告 | Warning: 199 Miscellaneous warning |
空行 #
它的用处只是用来区分请求头和请求体的
请求数据(请求体) #
- get:由于请求参数是在请求行的URI的后面跟着,所以并不会存储在请求体中,一般我们也会说get请求的请求体是没有的,多个请求参数之间是使用&分隔、连续的。
- post:请求参数是不在请求行中的uri后面的,是存储在请求体中的,所以post请求是有请求体的
响应消息结构 #
状态行 #
格式:协议/版本号 状态码
状态码:描述此次请求和响应的状态
消息报头(响应头) #
格式:key:value\r\n
| key | 说明 | 举例 |
|---|---|---|
| Access-Control-Allow-Origin | 指定哪些站点可以参与跨站资源共享 | Access-Control-Allow-Origin: * |
| Accept-Patch | 指定服务器支持的补丁文档格式,适用于http的patch方法 | Accept-Patch: text/example;charset=utf-8 |
| Accept-Ranges | 服务器通过byte serving支持的部分内容范围类型 | Accept-Ranges: bytes |
| Age | 对象在代理缓存中暂存的秒数 | Age: 12 |
| Allow | 设置特定资源的有效行为,适用方法不被允许的http 405错误 | Allow: GET, HEAD |
| Alt-Svc | 服务器使用"Alt-Svc"(Alternative Servicesde的缩写)头标识资源可以通过不同的网络位置或者不同的网络协议获取 | Alt-Svc: h2=“http2.example.com:443”; ma=7200 |
| Cache-Control | 告诉服务端到客户端所有的缓存机制是否可以缓存这个对象,单位是秒 | Cache-Control: max-age=3600 |
| Connection | 设置当前连接和hop-by-hop协议请求字段列表的控制选项 | Connection: close |
| Content-Disposition | 告诉客户端弹出一个文件下载框,并且可以指定下载文件名 | Content-Disposition: attachment; filename=“fname.ext” |
| Content-Encoding | 设置数据使用的编码类型 | Content-Encoding: gzip |
| Content-Language | 为封闭内容设置自然语言或者目标用户语言 | Content-Language: en |
| Content-Length | 响应体的字节长度 | Content-Length: 348 |
| Content-Location | 设置返回数据的另一个位置 | Content-Location: /index.htm |
| Content-MD5 | 设置基于MD5算法对响应体内容进行Base64二进制编码 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ== |
| Content-Range | 标识响应体内容属于完整消息体中的那一部分 | Content-Range: bytes 21010-47021/47022 |
| Content-Type | 设置响应体的MIME类型 | Content-Type: text/html; charset=utf-8 |
| Date | 设置消息发送的日期和时间 | Date: Tue, 15 Nov 1994 08:12:31 GMT |
| ETag | 特定版本资源的标识符,通常是消息摘要 | ETag: “737060cd8c284d8af7ad3082f209582d” |
| Expires | 设置响应体的过期时间 | Expires: Thu, 01 Dec 1994 16:00:00 GMT |
| Last-Modified | 设置请求对象最后一次的修改日期 | Last-Modified: Tue, 15 Nov 1994 12:45:26 GMT |
| Link | 设置与其他资源的类型关系 | Link: </feed>; rel="alternate" |
| Location | 在重定向中或者创建新资源时使用 | Location: http://www.w3.org/pub/WWW/People.html |
| P3P | 以P3P:CP=“your_compact_policy"的格式设置支持P3P(Platform for Privacy Preferences Project)策略,大部分浏览器没有完全支持P3P策略,许多站点设置假的策略内容欺骗支持P3P策略的浏览器以获取第三方cookie的授权 | P3P: CP=“This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info.” |
| Pragma | 设置特殊实现字段,可能会对请求响应链有多种影响 | Pragma: no-cache |
| Proxy-Authenticate | 设置访问代理的请求权限 | Proxy-Authenticate: Basic |
| Public-Key-Pins | 设置站点的授权TLS证书 | Public-Key-Pins: max-age=2592000; pin-sha256=“E9CZ9INDbd+2eRQozYqqbQ2yXLVKB9+xcprMF+44U1g=”; |
| Refresh | 重定向或者新资源创建时使用,在页面的头部有个扩展可以实现相似的功能,并且大部分浏览器都支持<meta http-equiv="refresh" content="5; url=http://example.com/"> |
Refresh: 5; url=http://www.w3.org/pub/WWW/People.html |
| Retry-After | 如果实体暂时不可用,可以设置这个值让客户端重试,可以使用时间段(单位是秒)或者HTTP时间 | Example 1: Retry-After: 120 Example 2: Retry-After: Fri, 07 Nov 2014 23:59:59 GMT |
| Server | 服务器名称 | Server: Apache/2.4.1 (Unix) |
| Set-Cookie | 设置HTTP Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1 |
| Status | 设置HTTP响应状态 | Status: 200 OK |
| Strict-Transport-Security | 一种HSTS策略通知HTTP客户端缓存HTTPS策略多长时间以及是否应用到子域 | Strict-Transport-Security: max-age=16070400; includeSubDomains |
| Trailer | 标识给定的header字段将展示在后续的chunked编码的消息中 | Trailer: Max-Forwards |
| Transfer-Encoding | 设置传输实体的编码格式,目前支持的格式: chunked, compress, deflate, gzip, identity | Transfer-Encoding: chunked |
| Upgrade | 请求客户端升级协议 | Upgrade: HTTP/2.0, HTTPS/1.3, IRC/6.9, RTA/x11, websocket |
| Vary | 通知下级代理如何匹配未来的请求头已让其决定缓存的响应是否可用而不是重新从源主机请求新的 | Example 1: Vary: * Example 2: Vary: Accept-Language |
| Via | 通知客户端代理,通过其要发送什么响应 | Via: 1.0 fred, 1.1 example.com (Apache/1.1) |
| Warning | 实体可能会发生的问题的通用警告 | Warning: 199 Miscellaneous warning |
| WWW-Authenticate | 标识访问请求实体的身份验证方案 | WWW-Authenticate: Basic |
| X-Frame-Options | 点击劫持保护 deny frame中不渲染 sameorigin 如果源不匹配不渲染 allow-from 允许指定位置访问 allowall 不标准,允许任意位置访问 |
X-Frame-Options: deny |
空行 #
为了区分响应头和响应体的
响应正文(响应体) #
相应的内容
常见的状态码 #
- 1XX:消息
- 这一类型的状态码,代表请求已被接受,需要继续处理
- 这类响应是临时响应,只包含状态行和某些可选的响应头信息,并以空行结束
- 服务器接收到了客户端的请求,但是还没有接收完成,等待了一会,服务器给客户端发送的状态码
- 2XX:成功
- 这一类型的状态码,代表请求已成功被服务器接收、理解、并接受。
- 200:代表没问题,成功
- 3XX:重定向
- 这类状态码代表需要客户端采取进一步的操作才能完成请求。
- 302:重定向
- 当我们访问服务器端的某一个资源的时候,如果响应状态吗为302,那我们就只到此资源是通过重定向返回给我们的
- 304:缓存
- 当我们第一次访问服务器的资源的时候,响应回来的状态是200,当我们再一次访问服务器的该资源的时候,那响应状态就是304;当我们清空缓存之后,再去访问服务器的资源的时候,响应状态码还是200,当我们再一次访问该资源,状态码又会变成304;当访问的资源被更新之后,那我们再去访问该资源的话,响应状态码会变成200
- 如何确定资源被更新:看资源文件最后修改时间
- 4XX:请求错误
- 这类的状态码代表了客户端看起来可能发生了错误,妨碍了服务器的处理
- 404:资源没找到
- 一般情况路径写错,或者资源名写错了
- 405:没有重写doGet()或者doPost()
- 5XX:服务器错误
- 这类状态码代表了服务器在处理请求的过程中有错误或者异常状态发生
- 500:出现了500,说明服务器有错误,而且产生这个问题的原因有很多种情况
URI、URL、URN #
- URI(Uniform Resource Identifier,统一资源标识符)是一个更通用的术语,它用于标识任何类型的资源。它可以是一个名字、地址或者两者的组合,以便在互联网上唯一地标识一个资源。URI可以用于识别和定位资源,但具体的定位方式可能因资源的类型而有所不同。
- URN(Uniform Resource Name,统一资源名称)是URI的一个子集,它被设计用于标识资源的名称而不是其位置。URN的目的是提供一个持久的、独特的标识符,即使资源的位置发生变化也能保持不变。URN通常用于标识需要长期访问的资源,如文档、书籍、文章等。URN的格式一般为"urn:namespace:identifier”,其中namespace表示命名空间,identifier表示资源的唯一标识符。
- URL(Uniform Resource Locator,统一资源定位器)是URI的另一个子集,它用于定位资源的具体位置。URL包含了访问资源所需的详细信息,如协议类型(如HTTP、FTP)、主机名、路径和查询参数等。URL通常用于标识可以通过特定协议访问的资源,如网页、图片、视频等。