## Web專題零:HTTP協議
[TOC]
### 1. Request請求
~~~
Request = Request-Line
*(( general-header
| request-header
| entity-header ) CRLF)
CRLF
[ message-body ]
~~~
請求Message的第一行是固定的請求行,如:`GET /rfc/rfc2616.txt HTTP/1.1
`
~~~
Request-Line = Method SP Request-URI SP HTTP-Version CRLF
~~~
- Method 請求方法包括下面7種:
`OPTIONS`,`GET`,`HEAD`,`POST`,`PUT`,`DELETE`,`TRACE`,`CONNECT`
- Request-URI 表示資源的路徑
- HTTP-Version HTTP協議版本一般都是HTTP/1.1
### 2. Response響應
~~~
Response = Status-Line
*(( general-header
| response-header
| entity-header ) CRLF)
CRLF
[ message-body ]
~~~
響應Message的第一行是固定的狀態行,如:`HTTP/1.1
200 OK`
~~~
Status-Line = HTTP-Version SP Status-Code SP Reason-Phrase CRLF
~~~
### 3. Header
字段
#### 3.1. Accept
> 用于指定某些媒體可接受的響應類型
語法:
~~~
Accept = "Accept" ":"
#( media-range [ accept-params ] )
media-range = ( "*/*"
| ( type "/" "*" )
| ( type "/" subtype )
) *( ";" parameter )
accept-params = ";" "q" "=" qvalue *( accept-extension )
accept-extension = ";" token [ "=" ( token | quoted-string ) ]
~~~
例子:
~~~
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9
~~~
#### 3.2. Cache-Control
> 用于指定指令在請求/響應鏈上的所有緩存機制必須遵守的約定,表明是否緩存,緩存時間等
語法:
~~~
Cache-Control = "Cache-Control" ":" 1#cache-directive
cache-directive = cache-request-directive
| cache-response-directive
cache-request-directive =
"no-cache" ;
| "no-store" ;
| "max-age" "=" delta-seconds ;
| "max-stale" [ "=" delta-seconds ] ;
| "min-fresh" "=" delta-seconds ;
| "no-transform" ;
| "only-if-cached" ;
| cache-extension ;
cache-response-directive =
"public" ;
| "private" [ "=" <"> 1#field-name <"> ] ;
| "no-cache" [ "=" <"> 1#field-name <"> ];
| "no-store" ;
| "no-transform" ;
| "must-revalidate" ;
| "proxy-revalidate" ;
| "max-age" "=" delta-seconds ;
| "s-maxage" "=" delta-seconds ;
| cache-extension ;
cache-extension = token [ "=" ( token | quoted-string ) ]
~~~
例子:
- Request頭部
~~~
Cache-Control: max-age=0
~~~
- Response頭部
~~~
Cache-Control: max-age=3600
~~~
#### 3.3. Expires
> 用于提供日期/時間,在這之后的響應被認為是過時的;
> 如果response中包含max-age的Cache-Control字段,則max-age的優先級比Expires的優先級高
語法:
~~~
Expires = "Expires" ":" HTTP-date
~~~
例子:
~~~
Expires: Tue, 21 Apr 2020 09:50:25 GMT
~~~
#### 3.4. Date
> 用于表示消息發出的日期時間,通常在Response響應頭中必須包含Date字段,除了Response響應status是100(Continue)、 101(Switching
Protocols)、500(Internal Server Error)、503(Service Unavailable)等,或者Server沒有一個時鐘用來生成合理準確的日期時間等情況
語法:
~~~
Date = "Date" ":" HTTP-date
~~~
例子:
~~~
Date: Tue, 21 Apr 2020 09:32:18 GMT
~~~
#### 3.5. Connection
> 用于指定發送者與服務器連接的需要的選項
語法:
~~~
Connection = "Connection" ":" 1#(connection-token)
connection-token = token
~~~
例子:
- 支持持久連接
~~~
Connection: keep-alive
~~~
- 不支持持久連接,連接完成后關閉連接
~~~
Connection: close
~~~
#### 3.6. User-Agent
> 用于代理用戶完成request,通常的user-agent是瀏覽器;
語法:
~~~
User-Agent = "User-Agent" ":" 1*( product | comment )
~~~
例子:
~~~
User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.87 Safari/537.36
~~~
#### 3.7. Server
> 用于表明響應request的服務器的信息
語法:
~~~
Server = "Server" ":" 1*( product | comment )
~~~
例子:
~~~
Server: Apache/2.4.18 (Ubuntu)
~~~
#### 3.8. Last-Modified
> 用于表明最后修改的時間
> 對于文件系統,是文件最后修改的時間
> 對于數據庫系統,是最后一次更新記錄的時間戳
語法:
~~~
Last-Modified = "Last-Modified" ":" HTTP-date
~~~
例子:
~~~
Last-Modified: Fri, 11 Jun 1999 18:46:53 GMT
~~~
#### 3.9. Status
> 用于表示請求后的狀態,用3位整數表示
| Item | Status | Description |
| :------------ | :------------ | :------------ |
| Informational | 100 | Continue |
| Informational | 101 | Switching Protocols |
| Successful | 200 | OK |
| Successful | 201 | Created |
| Successful | 202 | Accepted |
| Successful | 203 | Non-Authoritative Information |
| Successful | 204 | No Content |
| Successful | 205 | Reset Content |
| Successful | 206 | Partial Content |
| Redirection | 300 |Multiple Choices |
| Redirection | 301 | Moved Permanently|
| Redirection | 302 |Found |
| Redirection | 303 |See Other |
| Redirection | 304 |Not Modified |
| Redirection | 305 | Use Proxy|
| Redirection | 306 |(Unused) |
| Redirection | 307 |Temporary Redirect |
| Client Error | 400 | Bad Request|
| Client Error | 401 | Unauthorized|
| Client Error | 402 | Payment Required|
| Client Error | 403 | Forbidden|
| Client Error | 404 | Not Found |
| Client Error | 405 |Method Not Allowed |
| Client Error | 406 | Not Acceptable|
| Client Error | 407 |Proxy Authentication Required |
| Client Error | 408 | Request Timeout |
| Client Error | 409 |Conflict |
| Client Error | 410 | Gone|
| Client Error | 411 | Length Required|
| Client Error | 412 | Precondition Failed|
| Client Error | 413 |Request Entity Too Large |
| Client Error | 414 |Request-URI Too Long|
| Client Error | 415 | Unsupported Media Type |
| Client Error | 416 | Requested Range Not Satisfiable |
| Client Error | 417 |Expectation Failed|
| Server Error| 500 |Internal Server Error|
| Server Error| 501 |Not Implemented|
| Server Error| 502 |Bad Gateway |
| Server Error| 503 |Service Unavailable|
| Server Error| 504 |Gateway Timeout|
| Server Error| 505 |HTTP Version Not Supported|
- JavaCook
- Java專題零:類的繼承
- Java專題一:數據類型
- Java專題二:相等與比較
- Java專題三:集合
- Java專題四:異常
- Java專題五:遍歷與迭代
- Java專題六:運算符
- Java專題七:正則表達式
- Java專題八:泛型
- Java專題九:反射
- Java專題九(1):反射
- Java專題九(2):動態代理
- Java專題十:日期與時間
- Java專題十一:IO與NIO
- Java專題十一(1):IO
- Java專題十一(2):NIO
- Java專題十二:網絡
- Java專題十三:并發編程
- Java專題十三(1):線程與線程池
- Java專題十三(2):線程安全與同步
- Java專題十三(3):內存模型、volatile、ThreadLocal
- Java專題十四:JDBC
- Java專題十五:日志
- Java專題十六:定時任務
- Java專題十七:JavaMail
- Java專題十八:注解
- Java專題十九:淺拷貝與深拷貝
- Java專題二十:設計模式
- Java專題二十一:序列化與反序列化
- 附加專題一:MySQL
- MySQL專題零:簡介
- MySQL專題一:安裝與連接
- MySQL專題二:DDL與DML語法
- MySQL專題三:工作原理
- MySQL專題四:InnoDB存儲引擎
- MySQL專題五:sql優化
- MySQL專題六:數據類型
- 附加專題二:Mybatis
- Mybatis專題零:簡介
- Mybatis專題一:配置文件
- Mybatis專題二:映射文件
- Mybatis專題三:動態SQL
- Mybatis專題四:源碼解析
- 附加專題三:Web編程
- Web專題零:HTTP協議
- Web專題一:Servlet
- Web專題二:Cookie與Session
- 附加專題四:Redis
- Redis專題一:數據類型
- Redis專題二:事務
- Redis專題三:key的過期
- Redis專題四:消息隊列
- Redis專題五:持久化