# HTTP åè®®ç®ä» **HTTP** (HyperText Transfer Protocol, è¶ ææ¬ä¼ è¾åè®®)æ¯äºèç½ä¸åºç¨æä¸ºå¹¿æ³çä¸ç§ç½ç»åè®®ï¼å®æ¯åºäº [TCP][tcp] ç**åºç¨å±**åè®®ï¼ç®åå°è¯´å°±æ¯å®¢æ·ç«¯åæå¡å¨è¿è¡éä¿¡çä¸ç§è§åï¼å®ç模å¼é常ç®åï¼å°±æ¯**客æ·ç«¯å起请æ±ï¼æå¡å¨ååºè¯·æ±**ï¼å¦ä¸å¾æç¤ºï¼  HTTP ææ©äº 1991 å¹´åå¸ï¼æ¯ 0.9 çï¼ä¸è¿ç®åè¯¥çæ¬å·²ä¸åç¨ãHTTP ç®åå¨ä½¿ç¨ççæ¬ä¸»è¦æï¼ - HTTP/1.0ï¼äº 1996 å¹´ 5 æåå¸ï¼å¼å ¥äºå¤ç§åè½ï¼è³ä»ä»å¨ä½¿ç¨å½ä¸ã - HTTP/1.1ï¼äº 1997 å¹´ 1 æåå¸ï¼æä¹ è¿æ¥è¢«é»è®¤éç¨ï¼æ¯ç®åææµè¡ççæ¬ã - HTTP/2 ï¼äº 2015 å¹´ 5 æåå¸ï¼å¼å ¥äºæå¡å¨æ¨éçå¤ç§åè½ï¼æ¯ç®åææ°ççæ¬ã # HTTP è¯·æ± HTTP 请æ±ç±ä¸é¨åç»æï¼ - **请æ±è¡**ï¼å å«è¯·æ±æ¹æ³ã请æ±å°åå HTTP åè®®çæ¬ - **æ¶æ¯æ¥å¤´**ï¼å å«ä¸ç³»åçé®å¼å¯¹ - **è¯·æ±æ£æï¼å¯éï¼**ï¼æ³¨æåæ¶æ¯æ¥å¤´ä¹é´æä¸ä¸ªç©ºè¡ å¦å¾æç¤ºï¼  ä¸é¢æ¯ä¸ä¸ª HTTP GET 请æ±çä¾åï¼ ``` GET / HTTP/1.1 Host: httpbin.org Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: _ga=GA1.2.475070272.1480418329; _gat=1 ``` ä¸é¢ç第ä¸è¡å°±æ¯ä¸ä¸ª**请æ±è¡**ï¼ ``` GET / HTTP/1.1 ``` å ¶ä¸ï¼`GET` æ¯è¯·æ±æ¹æ³ï¼è¡¨ç¤ºä»æå¡å¨è·åèµæºï¼`/` æ¯ä¸ä¸ªè¯·æ±å°åï¼`HTTP/1.1` 表æ HTTP ççæ¬æ¯ 1.1ã 请æ±è¡åé¢çä¸ç³»åé®å¼å¯¹å°±æ¯**æ¶æ¯æ¥å¤´**ï¼ ``` Host: httpbin.org Connection: keep-alive Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.98 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8 Accept-Encoding: gzip, deflate, sdch, br Accept-Language: zh-CN,zh;q=0.8,en;q=0.6,zh-TW;q=0.4 Cookie: _ga=GA1.2.475034215.1480418329; _gat=1 ``` å ¶ä¸ï¼ - Host æ¯è¯·æ±æ¥å¤´åï¼ç¨äºæå®è¢«è¯·æ±èµæºç Internet 主æºå端å£å·ï¼å®éå¸¸ä» HTTP URL 䏿ååºæ¥ï¼ - Connection è¡¨ç¤ºè¿æ¥ç¶æï¼keep-alive è¡¨ç¤ºè¯¥è¿æ¥æ¯æä¹ è¿æ¥ï¼persistent connectionï¼ï¼å³ TCP è¿æ¥é»è®¤ä¸å ³éï¼å¯ä»¥è¢«å¤ä¸ªè¯·æ±å¤ç¨ï¼å¦æå®¢æ·ç«¯åæå¡å¨åç°å¯¹æ¹æä¸æ®µæ¶é´æ²¡ææ´»å¨ï¼å°±å¯ä»¥ä¸»å¨å ³éè¿æ¥ï¼ - Cache-Control ç¨äºæå®ç¼åæä»¤ï¼å®ç弿 no-cache, no-store, max-age çï¼`max-age=ç§`è¡¨ç¤ºèµæºå¨æ¬å°ç¼åå¤å°ç§ï¼ - User-Agent ç¨äºæ è¯è¯·æ±è çä¸äºä¿¡æ¯ï¼æ¯å¦æµè§å¨ç±»ååçæ¬ï¼æä½ç³»ç»çï¼ - Accept ç¨äºæå®å®¢æ·ç«¯å¸ææ¥ååªäºç±»åçä¿¡æ¯ï¼æ¯å¦ text/html, image/gif çï¼ - Accept-Encoding ç¨äºæå®å¯æ¥åçå 容ç¼ç ï¼ - Accept-Language ç¨äºæå®å¯æ¥åçèªç¶è¯è¨ï¼ - Cookie ç¨äºç»´æ¤ç¶æï¼å¯åç¨æ·è®¤è¯ï¼æå¡å¨æ£éªçï¼å®æ¯æµè§å¨å¨åå¨ç¨æ·çµèä¸çææ¬çæ®µï¼ ## HTTP è¯·æ±æ¹æ³ HTTP éè¿ä¸åçè¯·æ±æ¹æ³ä»¥å¤ç§æ¹å¼æ¥æä½æå®çèµæºï¼å¸¸ç¨çè¯·æ±æ¹æ³å¦ä¸è¡¨ï¼ | æ¹æ³ | æè¿° | | :-- | :-- | | GET | 仿å¡å¨è·åæå®ï¼è¯·æ±å°åï¼çèµæºçä¿¡æ¯ï¼å®é常åªç¨äºè¯»åæ°æ®ï¼å°±åæ°æ®åºæ¥è¯¢ä¸æ ·ï¼ä¸ä¼å¯¹èµæºè¿è¡ä¿®æ¹ã | | POST | åæå®èµæºæäº¤æ°æ®ï¼æ¯å¦æäº¤è¡¨åï¼ä¸ä¼ æä»¶ï¼ï¼è¯·æ±æå¡å¨è¿è¡å¤çãæ°æ®è¢«å å«å¨è¯·æ±æ£æä¸ï¼è¿ä¸ªè¯·æ±å¯è½ä¼å建æ°çèµæºææ´æ°ç°æçèµæºã | | PUT | éè¿æå®èµæºçå¯ä¸æ è¯ï¼å¨æå¡å¨ä¸çå ·ä½åæ¾ä½ç½®ï¼ï¼è¯·æ±æå¡å¨åå»ºææ´æ°èµæºã | | DELETE | è¯·æ±æå¡å¨å 餿å®èµæºã | | HEAD | ä¸ GET æ¹æ³ç±»ä¼¼ï¼ä»æå¡å¨è·åèµæºä¿¡æ¯ï¼å GET æ¹æ³ä¸åçæ¯ï¼HEAD ä¸å«æåç°æ°æ®ï¼ä» ä» æ¯ HTTP 头信æ¯ãHEAD ç好å¤å¨äºï¼ä½¿ç¨è¿ä¸ªæ¹æ³å¯ä»¥å¨ä¸å¿ ä¼ è¾å ¨é¨å å®¹çæ åµä¸ï¼å°±å¯ä»¥è·å¾èµæºçå ä¿¡æ¯ï¼æå æ°æ®ï¼ã | | OPTIONS | è¯¥æ¹æ³å¯ä½¿æå¡å¨ä¼ åèµæºææ¯æçææ HTTP è¯·æ±æ¹æ³ã | # HTTP ååº HTTP ååºä¸ HTTP 请æ±ç¸ä¼¼ï¼ç±ä¸é¨åç»æï¼ - **ç¶æè¡**ï¼å å« HTTP åè®®çæ¬ãç¶æç åç¶ææè¿°ï¼ä»¥ç©ºæ ¼åé - **ååºå¤´**ï¼å³æ¶æ¯æ¥å¤´ï¼å å«ä¸ç³»åçé®å¼å¯¹ - **ååºæ£æ**ï¼è¿åå å®¹ï¼æ³¨æåååºå¤´ä¹é´æä¸ä¸ªç©ºè¡ å¦å¾æç¤ºï¼  ä¸é¢æ¯ä¸ä¸ª HTTP GET 请æ±çååºç»æï¼ ``` HTTP/1.1 200 OK Server: nginx Date: Tue, 29 Nov 2016 13:08:38 GMT Content-Type: application/json Content-Length: 203 Connection: close Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true { "args": {}, "headers": { "Host": "httpbin.org", "User-Agent": "Paw/2.3.1 (Macintosh; OS X/10.11.3) GCDHTTPRequest" }, "origin": "13.75.42.240", "url": "https://httpbin.org/get" } ``` ä¸é¢ç第ä¸è¡å°±æ¯ä¸ä¸ª**ç¶æè¡**ï¼ ``` HTTP/1.1 200 OK ``` å ¶ä¸ï¼`200` æ¯ç¶æç ï¼è¡¨ç¤ºå®¢æ·ç«¯è¯·æ±æåï¼`OK` æ¯ç¸åºçç¶ææè¿°ã ç¶æç æ¯ä¸ä¸ªä¸ä½çæ°åï¼å¸¸è§çç¶æç æä»¥ä¸å ç±»ï¼ - 1XX æ¶æ¯ -- 请æ±å·²è¢«æå¡æ¥æ¶ï¼ç»§ç»å¤ç - 2XX æå -- 请æ±å·²æå被æå¡å¨æ¥æ¶ãçè§£ãå¹¶æ¥å - 200 OK - 201 Created å·²å建 - 202 Accepted æ¥æ¶ - 203 Non-Authoritative Information é认è¯ä¿¡æ¯ - 204 No Content æ å 容 - 3XX éå®å -- éè¦åç»æä½æè½å®æè¿ä¸è¯·æ± - 301 Moved Permanently è¯·æ±æ°¸ä¹ éå®å - 302 Moved Temporarily 请æ±ä¸´æ¶éå®å - 304 Not Modified æä»¶æªä¿®æ¹ï¼å¯ä»¥ç´æ¥ä½¿ç¨ç¼åçæä»¶ - 305 Use Proxy 使ç¨ä»£ç - 4XX 请æ±é误 -- 请æ±å«æè¯æ³é误æè æ æ³è¢«æ§è¡ - 400 Bad Request ç±äºå®¢æ·ç«¯è¯·æ±æè¯æ³é误ï¼ä¸è½è¢«æå¡å¨æçè§£ - 401 Unauthorized è¯·æ±æªç»ææãè¿ä¸ªç¶æä»£ç å¿ é¡»åWWW-Authenticateæ¥å¤´åä¸èµ·ä½¿ç¨ - 403 Forbidden æå¡å¨æ¶å°è¯·æ±ï¼ä½æ¯æç»æä¾æå¡ãæå¡å¨é常ä¼å¨ååºæ£æä¸ç»åºä¸æä¾æå¡çåå - 404 Not Found 请æ±çèµæºä¸åå¨ï¼ä¾å¦ï¼è¾å ¥äºé误çURL - 5XX æå¡å¨é误 -- æå¡å¨å¨å¤çæä¸ªæ£ç¡®è¯·æ±æ¶åçé误 - 500 Internal Server Error æå¡å¨åçä¸å¯é¢æçé误ï¼å¯¼è´æ æ³å®æå®¢æ·ç«¯çè¯·æ± - 503 Service Unavailable æå¡å¨å½åä¸è½å¤å¤ç客æ·ç«¯ç请æ±ï¼å¨ä¸æ®µæ¶é´ä¹åï¼æå¡å¨å¯è½ä¼æ¢å¤æ£å¸¸ - 504 Gateway Time-out ç½å ³è¶ æ¶ ç¶æè¡åé¢çä¸ç³»åé®å¼å¯¹å°±æ¯æ¶æ¯æ¥å¤´ï¼å³ååºå¤´ï¼ ``` Server: nginx Date: Tue, 29 Nov 2016 13:08:38 GMT Content-Type: application/json Content-Length: 203 Connection: close Access-Control-Allow-Origin: * Access-Control-Allow-Credentials: true ``` å ¶ä¸ï¼ - Server å å«äºæå¡å¨ç¨æ¥å¤ç请æ±ç软件信æ¯ï¼è·è¯·æ±æ¥å¤´å User-Agent ç¸å¯¹åºï¼ - Content-Type ç¨äºæå®åéç»æ¥æ¶è ï¼æ¯å¦æµè§å¨ï¼çååºæ£æçåªä½ç±»åï¼æ¯å¦ text/html, text/css, image/png, image/jpeg, video/mp4, application/pdf, application/json çï¼ - Content-Length æææ¬æ¬¡ååºçæ°æ®é¿åº¦ï¼ # åè®® POST å PUT 注æå°ï¼POST å PUT é½å¯ç¨äºåå»ºææ´æ°èµæºï¼ç¶èï¼å®ä»¬ä¹é´è¿æ¯ææ¯è¾å¤§çåºå«ï¼ - POST æå¯¹åºç URI å¹¶éå建çèµæºæ¬èº«ï¼èæ¯èµæºçæ¥æ¶è ï¼èµæºæ¬èº«çåæ¾ä½ç½®ç±æå¡å¨å³å®ï¼è PUT æå¯¹åºç URI æ¯è¦åå»ºææ´æ°çèµæºæ¬èº«ï¼å®ææäºå ·ä½çåæ¾ä½ç½® æ¯å¦ï¼å¾æä¸ªç«ç¹æ·»å ä¸ç¯æç« ï¼å¦æ**ä½¿ç¨ POST æ¥åå»ºèµæº**ï¼å¯ç±»ä¼¼è¿æ ·ï¼ ``` POST /articles HTTP/1.1 { "author": "ethan", "title": "hello world", "content": "hello world" } ``` å¨ä¸é¢ï¼POST 对åºç URI æ¯ `/articles`ï¼å®æ¯èµæºçæ¥æ¶è ï¼èéèµæºçæ è¯ï¼å¦æèµæºè¢«æååå»ºï¼æå¡å¨å¯ä»¥è¿å `201 Created` ç¶æä»¥åæ°å»ºèµæºçä½ç½®ï¼æ¯å¦ï¼ ``` HTTP/1.1 201 Created Location: /articles/abcdef123 ``` æä»¬å¦æç¥éæ°å»ºèµæºçæ è¯ç¬¦ï¼å¯ä»¥**ä½¿ç¨ PUT æ¥åå»ºèµæº**ï¼æ¯å¦ï¼ ``` PUT /articles/abcdef234 HTTP/1.1 { "author": "peter", "title": "hello world", "content": "hello world" } ``` å¨ä¸é¢ï¼PUT 对åºç URI æ¯ `/articles/abcdef234`ï¼å®ææäºèµæºçåæ¾ä½ç½®ï¼å¦æèµæºè¢«æååå»ºï¼æå¡å¨å¯ä»¥è¿å `201 Created` ç¶æä»¥åæ°å»ºèµæºçä½ç½®ï¼æ¯å¦ï¼ ``` HTTP/1.1 201 Created Location: /articles/abcdef234 ``` - ä½¿ç¨ PUT æ´æ°æä¸èµæºï¼éè¦æ´æ°èµæºçå ¨é¨å±æ§ï¼èä½¿ç¨ POSTï¼å¯ä»¥æ´æ°å ¨é¨æä¸é¨åå¼ æ¯å¦ä½¿ç¨ PUT æ´æ°å°å为 `/articles/abcdef234` çæç« çæ é¢ï¼æä»¬éè¦åéææå¼ï¼ ``` PUT /articles/abcdef234 HTTP/1.1 { "author": "peter", "title": "hello python", "content": "hello world" } ``` èä½¿ç¨ POSTï¼å¯ä»¥æ´æ°æä¸ªåçå¼ï¼ ``` POST /articles/abcdef234 HTTP/1.1 { "title": "hello python" } ``` - POST æ¯ä¸å¹ççï¼PUT æ¯å¹ççï¼è¿æ¯ä¸ä¸ªå¾éè¦çåºå« > HTTP æ¹æ³çå¹çæ§æ¯æä¸æ¬¡å夿¬¡è¯·æ±æä¸ä¸ªèµæºåºè¯¥å ·æåæ ·ç**å¯ä½ç¨**ï¼æ³¨æè¿éæ¯å¯ä½ç¨ï¼è䏿¯è¿åç»æã **GET** æ¹æ³ç¨äºè·åèµæºï¼ä¸ä¼æ¹åèµæºçç¶æï¼ä¸è®ºè°ç¨ä¸æ¬¡è¿æ¯å¤æ¬¡é½æ²¡æå¯ä½ç¨ï¼å æ¤å®æ¯å¹ççï¼**DELETE** æ¹æ³ç¨äºå é¤èµæºï¼æå¯ä½ç¨ï¼ä½è°ç¨ä¸æ¬¡æå¤æ¬¡é½æ¯å é¤åä¸ªèµæºï¼äº§ççå¯ä½ç¨æ¯ç¸åçï¼å æ¤ä¹æ¯å¹ççï¼**POST** æ¯ä¸å¹ççï¼å 为两次ç¸åç POST 请æ±ä¼å¨æå¡å¨åå»ºä¸¤ä»½èµæºï¼å®ä»¬å ·æä¸åç URIï¼**PUT** æ¯å¹ççï¼å¯¹åä¸ URI è¿è¡å¤æ¬¡ PUT çå¯ä½ç¨å䏿¬¡ PUT æ¯ç¸åçã # HTTP ç¹ç¹ - 客æ·ç«¯/æå¡å¨æ¨¡å¼ - ç®åå¿«éï¼å®¢æ·ç«¯åæå¡å¨è¯·æ±æå¡æ¶ï¼éè¿ä¼ éè¯·æ±æ¹æ³ã请æ±å°ååæ°æ®ä½ï¼å¯éï¼å³å¯ - çµæ´»ï¼å è®¸ä¼ è¾ä»»æç±»åçæ°æ®å¯¹è±¡ï¼éè¿ Content-Type æ è¯ - æ ç¶æï¼å¯¹äºç©å¤ç没记å¿è½å # å°ç» - HTTP æ¯å¨ç½ç»ä¸ä¼ è¾ HTML çåè®®ï¼ç¨äºæµè§å¨åæå¡å¨çéä¿¡ï¼é»è®¤ä½¿ç¨ 80 端å£ã - URL å°åç¨äºå®ä½èµæºï¼HTTP ä¸ç GET, POST, PUT, DELETE ç¨äºæä½èµæºï¼æ¯å¦æ¥è¯¢ï¼å¢å ï¼æ´æ°çã - GET, PUT, DELETE æ¯å¹ççï¼POST æ¯ä¸å¹ççã - POST VS PUT - ä½¿ç¨ PUT åå»ºèµæºéè¦æä¾èµæºçå¯ä¸æ è¯ï¼å ·ä½åæ¾ä½ç½®ï¼ï¼POST ä¸éè¦ï¼POST çæ°æ®åæ¾ä½ç½®ç±æå¡å¨èªå·±å³å® - ä½¿ç¨ PUT æ´æ°æä¸èµæºï¼éè¦æ´æ°èµæºçå ¨é¨å±æ§ï¼èä½¿ç¨ POSTï¼å¯ä»¥æ´æ°å ¨é¨æä¸é¨åå¼ - POST æ¯ä¸å¹ççï¼PUT æ¯å¹ççï¼è¿æ¯ä¸ä¸ªå¾éè¦çåºå« - GET å¯æäº¤çæ°æ®éåå° URL é¿åº¦çéå¶ï¼HTTP åè®®è§è没æå¯¹ URL é¿åº¦è¿è¡éå¶ï¼è¿ä¸ªéå¶æ¯ç¹å®çæµè§å¨åæå¡å¨å¯¹å®çéå¶ã - ç论ä¸è®²ï¼POST æ¯æ²¡æå¤§å°éå¶çï¼HTTP åè®®è§è乿²¡æè¿è¡å¤§å°éå¶ï¼åºäºå®å ¨èèï¼æå¡å¨è½¯ä»¶å¨å®ç°æ¶ä¼åä¸å®éå¶ã # åèèµæ - [è¶ ææ¬ä¼ è¾åè®® - ç»´åºç¾ç§ï¼èªç±çç¾ç§å ¨ä¹¦](https://zh.wikipedia.org/wiki/%E8%B6%85%E6%96%87%E6%9C%AC%E4%BC%A0%E8%BE%93%E5%8D%8F%E8%AE%AE#HTTP.2F1.1) - [HTTP åè®®å ¥é¨ - é®ä¸å³°çç½ç»æ¥å¿](http://www.ruanyifeng.com/blog/2016/08/http.html) - [HTTPå¹çæ§æ¦å¿µååºç¨ | é · 壳 - CoolShell.cn](http://coolshell.cn/articles/4787.html) - [Httpå议详解 - ç®ä¹¦](http://www.jianshu.com/p/e83d323c6bcc) - [When to use PUT or POST - The RESTful cookbook](http://restcookbook.com/HTTP%20Methods/put-vs-post/) - [To PUT or POST?](https://stormpath.com/blog/put-or-post) - [å ¨é¢è§£è¯»HTTP Cookie](http://www.webryan.net/2011/08/wiki-of-http-cookie/) - [HTTP cookies 详解 | bubkoo](http://bubkoo.com/2014/04/21/http-cookies-explained/) - [HTTP æ¥å£è®¾è®¡æå](https://github.com/bolasblack/http-api-guide) [tcp]: https://zh.wikipedia.org/wiki/%E4%BC%A0%E8%BE%93%E6%8E%A7%E5%88%B6%E5%8D%8F%E8%AE%AE