RESTful架構(gòu)以及HTTP協(xié)議

HTTP協(xié)議

HTTP協(xié)議描述

HTTP協(xié)議是Hyper Text Transfer Protocol(超文本傳輸協(xié)議)的縮寫,是用于從萬(wàn)維網(wǎng)(WWW:World Wide Web )服務(wù)器傳輸超文本[1]到本地瀏覽器的傳送協(xié)議兰绣。HTTP是一個(gè)基于TCP/IP通信協(xié)議來(lái)傳遞數(shù)據(jù)(HTML 文件, 圖片文件, 查詢結(jié)果等)。

通常,由HTTP客戶端發(fā)起一個(gè)請(qǐng)求,建立一個(gè)到服務(wù)器指定端口(默認(rèn)是80端口)的TCP連接链沼。HTTP服務(wù)器則在那個(gè)端口監(jiān)聽客戶端發(fā)送過(guò)來(lái)的請(qǐng)求晦毙。一旦收到請(qǐng)求,服務(wù)器(向客戶端)發(fā)回一個(gè)狀態(tài)行资厉,比如"HTTP/1.1 200 OK"王污,和(響應(yīng)的)消息罢吃,消息的消息體可能是請(qǐng)求的文件、錯(cuò)誤消息昭齐、或者其它一些信息刃麸。

HTTP是一個(gè)客戶端和服務(wù)器端請(qǐng)求和應(yīng)答的標(biāo)準(zhǔn)(TCP)∷纠耍客戶端是終端用戶,服務(wù)器端是網(wǎng)站把沼。通過(guò)使用Web瀏覽器啊易、網(wǎng)絡(luò)爬蟲或者其它工具的客戶端發(fā)起一個(gè)到服務(wù)器上指定端口(默認(rèn)端口為80)的HTTP請(qǐng)求,稱這個(gè)客戶端叫用戶代理(user agent)饮睬。

在Internet中所有的傳輸都是通過(guò)TCP/IP進(jìn)行的租谈。HTTP協(xié)議作為TCP/IP模型中應(yīng)用層的協(xié)議也不例外。HTTP協(xié)議通常承載于TCP協(xié)議之上捆愁,有時(shí)也承載于TLS或SSL協(xié)議層之上割去,這個(gè)時(shí)候,就成了我們常說(shuō)的HTTPS昼丑。
<center>


15215564008151.jpg -w400

</center>

HTTP默認(rèn)的端口號(hào)為80呻逆,HTTPS的端口號(hào)為443。

瀏覽網(wǎng)頁(yè)是HTTP的主要應(yīng)用菩帝,但是這并不代表HTTP就只能應(yīng)用于網(wǎng)頁(yè)的瀏覽咖城。HTTP是一種協(xié)議茬腿,只要通信的雙方都遵守這個(gè)協(xié)議,HTTP就能有用武之地宜雀。

HTTP特點(diǎn)

  1. 無(wú)狀態(tài):每次HTTP請(qǐng)求都是獨(dú)立的切平,任何兩個(gè)請(qǐng)求之間沒(méi)有什么必然的聯(lián)系。

    協(xié)議的狀態(tài)是指下一次傳輸可以“記住”這次傳輸信息的能力辐董。HTTP是不會(huì)為了下一次連接而維護(hù)這次連接所傳輸?shù)男畔?為了保證服務(wù)器內(nèi)存悴品。

  2. 支持客戶/服務(wù)器模式。支持基本認(rèn)證和安全認(rèn)證简烘。

  3. 簡(jiǎn)單快速:客戶向服務(wù)器請(qǐng)求服務(wù)時(shí)苔严,只需傳送請(qǐng)求方法和路徑。請(qǐng)求方法常用的有GET夸研、HEAD邦蜜、POST。每種方法規(guī)定了客戶與服務(wù)器聯(lián)系的類型不同亥至。由于HTTP協(xié)議簡(jiǎn)單悼沈,使得HTTP服務(wù)器的程序規(guī)模小,因而通信速度很快姐扮。

  4. 靈活:HTTP允許傳輸任意類型的數(shù)據(jù)對(duì)象絮供。正在傳輸?shù)念愋陀蒀ontent-Type加以標(biāo)記。

  5. HTTP 0.9和1.0使用非持續(xù)連接:限制每次連接只處理一個(gè)請(qǐng)求茶敏,服務(wù)器處理完客戶的請(qǐng)求壤靶,并收到客戶的應(yīng)答后,即斷開連接惊搏。HTTP 1.1使用持續(xù)連接:不必為每個(gè)web對(duì)象創(chuàng)建一個(gè)新的連接贮乳,一個(gè)連接可以傳送多個(gè)對(duì)象,采用這種方式可以節(jié)省傳輸時(shí)間恬惯。

HTTP工作流程

一次HTTP操作稱為一個(gè)事務(wù)向拆,其工作過(guò)程可分為四步:

  1. 首先客戶機(jī)與服務(wù)器需要建立連接。只要單擊某個(gè)超級(jí)鏈接酪耳,HTTP的工作開始浓恳。
  2. 建立連接后,客戶機(jī)發(fā)送一個(gè)請(qǐng)求給服務(wù)器碗暗,請(qǐng)求方式的格式為:統(tǒng)一資源標(biāo)識(shí)符(URL)颈将、協(xié)議版本號(hào),后邊是MIME信息包括請(qǐng)求修飾符言疗、客戶機(jī)信息和可能的內(nèi)容晴圾。
  3. 服務(wù)器接到請(qǐng)求后,給予相應(yīng)的響應(yīng)信息噪奄,其格式為一個(gè)狀態(tài)行疑务,包括信息的協(xié)議版本號(hào)沾凄、一個(gè)成功或錯(cuò)誤的代碼,后邊是MIME信息包括服務(wù)器信息知允、實(shí)體信息和可能的內(nèi)容撒蟀。
  4. 客戶端接收服務(wù)器所返回的信息通過(guò)瀏覽器顯示在用戶的顯示屏上,然后客戶機(jī)與服務(wù)器斷開連接温鸽。

URI

URI(統(tǒng)一資源標(biāo)識(shí)符)[2]:是一個(gè)用于標(biāo)識(shí)某一互聯(lián)網(wǎng)資源名稱的字符串保屯。而這個(gè)資源由兩個(gè)部分確定:資源地址信息(URL)+資源名稱信息(URN);

常見的URI格式如下:
http://user:password@host.com:8080/p/a/t/h?query=string&action=add#has

URI組成 含義
http:// 協(xié)議名稱
user 用戶名
password 對(duì)應(yīng)密碼
host.com 主機(jī)域名地址(異或主機(jī)ip地址)
:8080 端口號(hào),默認(rèn)80
/p/a/t/h 虛擬資源路徑
query=string&action=add 參數(shù)傳遞
hash 錨點(diǎn)

HTTP請(qǐng)求與響應(yīng)

HTTP協(xié)議分為請(qǐng)求(Request)與響應(yīng)(Response)兩個(gè)部分涤垫。

Request——請(qǐng)求

請(qǐng)求內(nèi)容

請(qǐng)求信息內(nèi)容包括以下幾點(diǎn):

  • 請(qǐng)求行——request line
    • 請(qǐng)求方法:GET/POST/HEAD/DELETE/PUT/TRACE/OPTIONS姑尺。方法名稱是區(qū)分大小寫的。當(dāng)某個(gè)請(qǐng)求所針對(duì)的資源不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候蝠猬,服務(wù)器應(yīng)當(dāng)返回狀態(tài)碼405(Method Not Allowed)切蟋;當(dāng)服務(wù)器不認(rèn)識(shí)或者不支持對(duì)應(yīng)的請(qǐng)求方法的時(shí)候,應(yīng)當(dāng)返回狀態(tài)碼501(Not Implemented)榆芦。HTTP服務(wù)器至少應(yīng)該實(shí)現(xiàn)GET和HEAD方法柄粹,其他方法都是可選的。此外匆绣,除了上述方法驻右,特定的HTTP服務(wù)器還能夠擴(kuò)展自定義的方法。

      請(qǐng)求方法 含義
      OPTIONS 返回服務(wù)器針對(duì)特定資源所支持的HTTP請(qǐng)求方法崎淳。也可以利用向Web服務(wù)器發(fā)送'*'的請(qǐng)求來(lái)測(cè)試服務(wù)器的功能性堪夭。
      HEAD 向服務(wù)器索要與GET請(qǐng)求相一致的響應(yīng),只不過(guò)響應(yīng)體將不會(huì)被返回拣凹。這一方法可以在不必傳輸整個(gè)響應(yīng)內(nèi)容的情況下森爽,就可以獲取包含在響應(yīng)消息頭中的元信息。該方法常用于測(cè)試超鏈接的有效性嚣镜,是否可以訪問(wèn)爬迟,以及最近是否更新。
      GET 向特定的資源發(fā)出請(qǐng)求祈惶。注意:GET方法不應(yīng)當(dāng)被用于產(chǎn)生“副作用”的操作中,例如在web app中扮匠。其中一個(gè)原因是GET可能會(huì)被網(wǎng)絡(luò)蜘蛛等隨意訪問(wèn)捧请。
      POST 向指定資源提交數(shù)據(jù)進(jìn)行處理請(qǐng)求(例如提交表單或者上傳文件)。數(shù)據(jù)被包含在請(qǐng)求體中棒搜。POST請(qǐng)求可能會(huì)導(dǎo)致新的資源的建立和/或已有資源的修改疹蛉。
      PUT 向指定資源位置上傳其最新內(nèi)容。
      DELETE 請(qǐng)求服務(wù)器刪除Request-URI所標(biāo)識(shí)的資源力麸。
      TRACE 回顯服務(wù)器收到的請(qǐng)求可款,主要用于測(cè)試或診斷育韩。
      CONNECT HTTP/1.1協(xié)議中預(yù)留給能夠?qū)⑦B接改為管道方式的代理服務(wù)器。
      PATCH 用來(lái)將局部修改應(yīng)用于某一資源闺鲸,添加于規(guī)范RFC5789筋讨。
    • 請(qǐng)求資源虛擬路徑

    • 請(qǐng)求協(xié)議

  • 請(qǐng)求頭信息——header
    • POST請(qǐng)求頭是需要追那個(gè)請(qǐng)求主體的長(zhǎng)度;如果不注明長(zhǎng)度則不會(huì)發(fā)送請(qǐng)求主體信息摸恍;

      content-length:length # length為非零整型數(shù)據(jù)
      
    • 服務(wù)器要想能夠解析道POST數(shù)據(jù)還需要請(qǐng)求頭包含數(shù)據(jù)類型

      content-length:appliacation/x-www-from-urlencoded #數(shù)據(jù)編碼格式
      
    • 格式為key=>value鍵值對(duì)的形式

  • 空行
  • 請(qǐng)求主體信息
    • 使用“&”拼接在一起的key=>value鍵值對(duì)悉罕。

【注意】
請(qǐng)求頭信息與請(qǐng)求主體信息之間要有一個(gè)空行!

請(qǐng)求格式
METHOD /path-to-resource HTTP/Version-number
Header-name-1:Value
Header-name-2:Value

Optional request body
示例
# GET 請(qǐng)求
GET /generate_204 HTTP/1.1 //請(qǐng)求方法 請(qǐng)求虛擬路徑 請(qǐng)求協(xié)議——請(qǐng)求行
User-Agent: Dalvik/2.1.0 (Linux; U; Android 7.0; MI 5 MIUI/V9.5.1.0.NAACNFA)    //請(qǐng)求頭
Host: connect.rom.miui.com  //主機(jī)——請(qǐng)求頭
Connection: Keep-Alive  //請(qǐng)求頭
Accept-Encoding: gzip   //請(qǐng)求頭

# POST 請(qǐng)求
POST /quickService/ajax/getServiceCategory.ajax.php HTTP/1.1    //請(qǐng)求行
Host: api1.yaxinzhichuang.com   //請(qǐng)求頭
Content-Length: 26  //請(qǐng)求頭
Pragma: no-cache
Cache-Control: no-cache
Accept: application/json
Origin: http://api1.yaxinzhichuang.com
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Linux; Android 7.0; MI 5 Build/NRD90M; wv) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/62.0.3202.84 Mobile Safari/537.36
Content-Type: application/x-www-form-urlencoded
Referer: http://api1.yaxinzhichuang.com/quickService/index.php?action=quickService
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.9
Cookie: PHPSESSID=497cde80b0d132a375e872bae9668c41
    // 空行
action=children&parentId=2  //  請(qǐng)求主體信息

Response——響應(yīng)

響應(yīng)內(nèi)容

響應(yīng)信息內(nèi)容包括以下幾點(diǎn):

  • 響應(yīng)行
    • 由HTTP協(xié)議版本號(hào)
    • 狀態(tài)碼
    • 狀態(tài)文字
  • 響應(yīng)頭信息
    • 格式為key=>value鍵值對(duì)的形式
  • 空行
  • 響應(yīng)主體信息(也可能沒(méi)有)
響應(yīng)格式
HTTP/Version-number status-code message 
Header-name-1:Value
Header-name-2:Value

Optional response body
示例
## json響應(yīng)
HTTP/1.1 200 OK     //  響應(yīng)行
Date: Tue, 20 Mar 2018 16:11:59 GMT //響應(yīng)行
Server: Apache/2.2.34 (Unix)    //響應(yīng)行
Expires: Thu, 19 Nov 1981 08:52:00 GMT  //響應(yīng)行
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0   //響應(yīng)行
Pragma: no-cache    //響應(yīng)行
Content-Length: 146 //響應(yīng)行
Content-Type: text/json;charset=utf-8   //響應(yīng)行
Proxy-Connection: Keep-alive    //響應(yīng)行
    //空行
{"Code":100000,"Msg":"操作成功立镶!","Data":{"List":[{"value":"7","text":"電腦系統(tǒng)服務(wù)"},{"value":"45","text":"維修"}],"uploadImg":"1"}}    ////響應(yīng)主體信息壁袄,可能是html頁(yè)面;

API

定義

一些預(yù)先定義的函數(shù)媚媒,目的是能夠讓應(yīng)用程序或開發(fā)人員能夠具有訪問(wèn)指定網(wǎng)絡(luò)資源的能力嗜逻,而無(wú)需關(guān)心訪問(wèn)的遠(yuǎn)嗎以及內(nèi)部的工作機(jī)制細(xì)節(jié)。

RESTful

為了統(tǒng)一API結(jié)構(gòu)設(shè)計(jì)規(guī)范提出的一種架構(gòu)標(biāo)準(zhǔn)缭召;然而栈顷,RESTful并不是唯一的API架構(gòu)標(biāo)準(zhǔn)。
REST是“REpresentational State Transfer”的縮寫恼琼;表現(xiàn)性狀態(tài)轉(zhuǎn)換妨蛹;

概念

在RESTful架構(gòu)中認(rèn)為所有一切都是資源,每個(gè)資源有對(duì)應(yīng)的URI[2]標(biāo)識(shí)晴竞;
處理資源的操作有:

操作名稱 請(qǐng)求動(dòng)作名稱
GET 獲取資源
POST 添加資源
PUT 修改資源(非嚴(yán)格遵行RESTful架構(gòu))
UPDATE/PATCH 修改資源(嚴(yán)格遵行RESTful架構(gòu))
DELETE 刪除資源

客戶端通過(guò)以上4種http動(dòng)詞蛙卤,對(duì)服務(wù)器資源進(jìn)行操作,實(shí)現(xiàn)“表現(xiàn)層狀態(tài)轉(zhuǎn)化”噩死;

【注意】
只是一種架構(gòu)而不是標(biāo)準(zhǔn)颤难,提供設(shè)計(jì)原則和約束條件。
適用于客戶端與服務(wù)器交互類的軟件已维,這是因?yàn)樗雍?jiǎn)潔行嗤、有層次、更利于實(shí)現(xiàn)緩存等機(jī)制垛耳;

規(guī)范

協(xié)議

REST API與客戶端通信協(xié)議為http協(xié)議栅屏;

域名

應(yīng)該盡量將API放在專屬于名下。

http://api.example.com

版本

應(yīng)該將API的版本好放入U(xiǎn)RL中堂鲜。

http://api.example.com/version/

路徑

表示API的具體網(wǎng)址栈雳,在RESTful架構(gòu)中,每個(gè)網(wǎng)址代表了一種資源缔莲,所以網(wǎng)址中不能有動(dòng)詞哥纫,只能有名詞,故API中的名詞應(yīng)該用復(fù)數(shù)形式痴奏。

http動(dòng)詞

對(duì)http資源的具體操作類型蛀骇,有http動(dòng)詞表示厌秒。

操作名稱 請(qǐng)求動(dòng)作名稱
GET(SELET) 從服務(wù)器中獲取資源
POST(CREATE) 在服務(wù)器中創(chuàng)建一個(gè)新的資源
PUT(UPDATE) 從服務(wù)器中更新資源
DELETE(DELETE) 從服務(wù)器中刪除資源

過(guò)濾信息

過(guò)濾信息可以理解為query string即:?limit=10&page=1&id=12;為API提供參數(shù)擅憔,過(guò)濾并返回結(jié)果鸵闪。

狀態(tài)碼

服務(wù)器向用戶返回的狀態(tài)嗎和提示信息,常見的有以下部分:

  • 2XX:這一類型的狀態(tài)碼雕欺,代表請(qǐng)求已成功被服務(wù)器接收岛马、理解、并接受屠列。
  • 3xx重定向:這類狀態(tài)碼代表需要客戶端采取進(jìn)一步的操作才能完成請(qǐng)求啦逆。通常,這些狀態(tài)碼用來(lái)重定向笛洛,后續(xù)的請(qǐng)求地址(重定向目標(biāo))在本次響應(yīng)的Location域中指明夏志。當(dāng)且僅當(dāng)后續(xù)的請(qǐng)求所使用的方法是GET或者HEAD時(shí),用戶瀏覽器才可以在沒(méi)有用戶介入的情況下自動(dòng)提交所需要的后續(xù)請(qǐng)求苛让」得铮客戶端應(yīng)當(dāng)自動(dòng)監(jiān)測(cè)無(wú)限循環(huán)重定向(例如:A→B→C→……→A或A→A),因?yàn)檫@會(huì)導(dǎo)致服務(wù)器和客戶端大量不必要的資源消耗狱杰。按照HTTP/1.0版規(guī)范的建議瘦材,瀏覽器不應(yīng)自動(dòng)訪問(wèn)超過(guò)5次的重定向。
  • 4xx客戶端錯(cuò)誤:這類的狀態(tài)碼代表了客戶端看起來(lái)可能發(fā)生了錯(cuò)誤仿畸,妨礙了服務(wù)器的處理食棕。除非響應(yīng)的是一個(gè)HEAD請(qǐng)求,否則服務(wù)器就應(yīng)該返回一個(gè)解釋當(dāng)前錯(cuò)誤狀況的實(shí)體错沽,以及這是臨時(shí)的還是永久性的狀況簿晓。這些狀態(tài)碼適用于任何請(qǐng)求方法。瀏覽器應(yīng)當(dāng)向用戶顯示任何包含在此類錯(cuò)誤響應(yīng)中的實(shí)體內(nèi)容千埃。
  • 5xx服務(wù)器錯(cuò)誤:表示服務(wù)器無(wú)法完成明顯有效的請(qǐng)求憔儿。這類狀態(tài)碼代表了服務(wù)器在處理請(qǐng)求的過(guò)程中有錯(cuò)誤或者異常狀態(tài)發(fā)生,也有可能是服務(wù)器意識(shí)到以當(dāng)前的軟硬件資源無(wú)法完成對(duì)請(qǐng)求的處理放可。除非這是一個(gè)HEAD請(qǐng)求谒臼,否則服務(wù)器應(yīng)當(dāng)包含一個(gè)解釋當(dāng)前錯(cuò)誤狀態(tài)以及這個(gè)狀況是臨時(shí)的還是永久的解釋信息實(shí)體。瀏覽器應(yīng)當(dāng)向用戶展示任何在當(dāng)前響應(yīng)中被包含的實(shí)體耀里。這些狀態(tài)碼適用于任何響應(yīng)方法蜈缤。
狀態(tài)碼 含義 備注
200 OK 請(qǐng)求已成功,請(qǐng)求所希望的響應(yīng)頭或數(shù)據(jù)體將隨此響應(yīng)返回备韧。 實(shí)際的響應(yīng)將取決于所使用的請(qǐng)求方法劫樟。在GET請(qǐng)求中痪枫,響應(yīng)將包含與請(qǐng)求的資源相對(duì)應(yīng)的實(shí)體织堂。在POST請(qǐng)求中叠艳,響應(yīng)將包含描述或操作結(jié)果的實(shí)體。
201 Created 請(qǐng)求已經(jīng)被實(shí)現(xiàn)易阳,而且有一個(gè)新的資源已經(jīng)依據(jù)請(qǐng)求的需要而創(chuàng)建附较,且其URI已經(jīng)隨Location頭信息返回。 假如需要的資源無(wú)法及時(shí)創(chuàng)建的話潦俺,應(yīng)當(dāng)返回'202 Accepted'拒课。
202 Accepted 服務(wù)器已接受請(qǐng)求,但尚未處理事示。最終該請(qǐng)求可能會(huì)也可能不會(huì)被執(zhí)行早像,并且可能在處理發(fā)生時(shí)被禁止。
203 Non-Authoritative Information 服務(wù)器是一個(gè)轉(zhuǎn)換代理服務(wù)器(transforming proxy肖爵,例如網(wǎng)絡(luò)加速器)卢鹦,以200 OK狀態(tài)碼為起源,但回應(yīng)了原始響應(yīng)的修改版本劝堪。 自HTTP / 1.1起
204 No Content 服務(wù)器成功處理了請(qǐng)求冀自,沒(méi)有返回任何內(nèi)容。
205 Reset Content 服務(wù)器成功處理了請(qǐng)求秒啦,但沒(méi)有返回任何內(nèi)容熬粗。 與204響應(yīng)不同,此響應(yīng)要求請(qǐng)求者重置文檔視圖余境。
206 Partial Content 服務(wù)器已經(jīng)成功處理了部分GET請(qǐng)求驻呐。類似于FlashGet或者迅雷這類的HTTP。下載工具都是使用此類響應(yīng)實(shí)現(xiàn)斷點(diǎn)續(xù)傳或者將一個(gè)大文檔分解為多個(gè)下載段同時(shí)下載葛超。
207 Multi-Status 代表之后的消息體將是一個(gè)XML消息暴氏,并且可能依照之前子請(qǐng)求數(shù)量的不同,包含一系列獨(dú)立的響應(yīng)代碼绣张。 (WebDAV答渔;RFC 4918)
208 Already Reported DAV綁定的成員已經(jīng)在(多狀態(tài))響應(yīng)之前的部分被列舉,且未被再次包含侥涵。
226 IM Used 服務(wù)器已經(jīng)滿足了對(duì)資源的請(qǐng)求沼撕,對(duì)實(shí)體請(qǐng)求的一個(gè)或多個(gè)實(shí)體操作的結(jié)果表示。
300 Multiple Choices 被請(qǐng)求的資源有一系列可供選擇的回饋信息芜飘,每個(gè)都有自己特定的地址和瀏覽器驅(qū)動(dòng)的商議信息务豺。 用戶或?yàn)g覽器能夠自行選擇一個(gè)首選的地址進(jìn)行重定向。
301 Moved Permanently 被請(qǐng)求的資源已永久移動(dòng)到新位置嗦明,并且將來(lái)任何對(duì)此資源的引用都應(yīng)該使用本響應(yīng)返回的若干個(gè)URI之一笼沥。
302 Found 要求客戶端執(zhí)行臨時(shí)重定向(原始描述短語(yǔ)為“Moved Temporarily”)。由于這樣的重定向是臨時(shí)的,客戶端應(yīng)當(dāng)繼續(xù)向原有地址發(fā)送以后的請(qǐng)求奔浅。 只有在Cache-Control或Expires中進(jìn)行了指定的情況下馆纳,這個(gè)響應(yīng)才是可緩存的。
303 See Other 對(duì)應(yīng)當(dāng)前請(qǐng)求的響應(yīng)可以在另一個(gè)URI上被找到汹桦,當(dāng)響應(yīng)于POST(或PUT / DELETE)接收到響應(yīng)時(shí)鲁驶,客戶端應(yīng)該假定服務(wù)器已經(jīng)收到數(shù)據(jù),并且應(yīng)該使用單獨(dú)的GET消息發(fā)出重定向舞骆。
304 Not Modified 表示資源未被修改钥弯,因?yàn)檎?qǐng)求頭指定的版本If-Modified-Since或If-None-Match。在這種情況下督禽,由于客戶端仍然具有以前下載的副本脆霎,因此不需要重新傳輸資源。
305 Use Proxy 被請(qǐng)求的資源必須通過(guò)指定的代理才能被訪問(wèn)狈惫。Location域中將給出指定的代理所在的URI信息绪穆,接收者需要重復(fù)發(fā)送一個(gè)單獨(dú)的請(qǐng)求,通過(guò)這個(gè)代理才能訪問(wèn)相應(yīng)資源虱岂。只有原始服務(wù)器才能創(chuàng)建305響應(yīng)玖院。許多HTTP客戶端(像是Mozilla和Internet Explorer)都沒(méi)有正確處理這種狀態(tài)代碼的響應(yīng),主要是出于安全考慮第岖。
306 Switch Proxy 是指“后續(xù)請(qǐng)求應(yīng)使用指定的代理”难菌。 最新版的規(guī)范中,306狀態(tài)碼已經(jīng)不再被使用蔑滓。
307 Temporary Redirect 在這種情況下郊酒,請(qǐng)求應(yīng)該與另一個(gè)URI重復(fù),但后續(xù)的請(qǐng)求應(yīng)仍使用原始的URI键袱。 與302相反燎窘,當(dāng)重新發(fā)出原始請(qǐng)求時(shí),不允許更改請(qǐng)求方法蹄咖。 例如褐健,應(yīng)該使用另一個(gè)POST請(qǐng)求來(lái)重復(fù)POST請(qǐng)求。
308 Permanent Redirect 請(qǐng)求和所有將來(lái)的請(qǐng)求應(yīng)該使用另一個(gè)URI重復(fù)澜汤。 307和308重復(fù)302和301的行為蚜迅,但不允許HTTP方法更改。 例如俊抵,將表單提交給永久重定向的資源可能會(huì)順利進(jìn)行谁不。 .
400 Bad Request 由于明顯的客戶端錯(cuò)誤(例如,格式錯(cuò)誤的請(qǐng)求語(yǔ)法徽诲,太大的大小刹帕,無(wú)效的請(qǐng)求消息或欺騙性路由請(qǐng)求)吵血,服務(wù)器不能或不會(huì)處理該請(qǐng)求。
401 Unauthorized 類似于403 Forbidden偷溺,401語(yǔ)義即“未認(rèn)證”践瓷,即用戶沒(méi)有必要的憑據(jù)。該狀態(tài)碼表示當(dāng)前請(qǐng)求需要用戶驗(yàn)證亡蓉。該響應(yīng)必須包含一個(gè)適用于被請(qǐng)求資源的WWW-Authenticate信息頭用以詢問(wèn)用戶信息∨缫ǎ客戶端可以重復(fù)提交一個(gè)包含恰當(dāng)?shù)腁uthorization頭信息的請(qǐng)求砍濒。
402 Payment Required 該狀態(tài)碼是為了將來(lái)可能的需求而預(yù)留的。該狀態(tài)碼最初的意圖可能被用作某種形式的數(shù)字現(xiàn)金或在線支付方案的一部分硫麻,但幾乎沒(méi)有哪家服務(wù)商使用爸邢,而且這個(gè)狀態(tài)碼通常不被使用。如果特定開發(fā)人員已超過(guò)請(qǐng)求的每日限制拿愧,Google Developers API會(huì)使用此狀態(tài)碼杠河。
403 Forbidden 服務(wù)器已經(jīng)理解請(qǐng)求,但是拒絕執(zhí)行它浇辜。如果這不是一個(gè)HEAD請(qǐng)求券敌,而且服務(wù)器希望能夠講清楚為何請(qǐng)求不能被執(zhí)行,那么就應(yīng)該在實(shí)體內(nèi)描述拒絕的原因柳洋。當(dāng)然服務(wù)器也可以返回一個(gè)404響應(yīng)待诅,假如它不希望讓客戶端獲得任何信息。 與401響應(yīng)不同的是熊镣,身份驗(yàn)證并不能提供任何幫助卑雁,而且這個(gè)請(qǐng)求也不應(yīng)該被重復(fù)提交。
404 Not Found 請(qǐng)求失敗绪囱,請(qǐng)求所希望得到的資源未被在服務(wù)器上發(fā)現(xiàn)测蹲,但允許用戶的后續(xù)請(qǐng)求。沒(méi)有信息能夠告訴用戶這個(gè)狀況到底是暫時(shí)的還是永久的鬼吵。假如服務(wù)器知道情況的話扣甲,應(yīng)當(dāng)使用410狀態(tài)碼來(lái)告知舊資源因?yàn)槟承﹥?nèi)部的配置機(jī)制問(wèn)題,已經(jīng)永久的不可用齿椅,而且沒(méi)有任何可以跳轉(zhuǎn)的地址文捶。404這個(gè)狀態(tài)碼被廣泛應(yīng)用于當(dāng)服務(wù)器不想揭示到底為何請(qǐng)求被拒絕或者沒(méi)有其他適合的響應(yīng)可用的情況下。
405 Method Not Allowed 請(qǐng)求行中指定的請(qǐng)求方法不能被用于請(qǐng)求相應(yīng)的資源媒咳。該響應(yīng)必須返回一個(gè)Allow頭信息用以表示出當(dāng)前資源能夠接受的請(qǐng)求方法的列表粹排。例如,需要通過(guò)POST呈現(xiàn)數(shù)據(jù)的表單上的GET請(qǐng)求涩澡,或只讀資源上的PUT請(qǐng)求顽耳。
406 Not Acceptable 請(qǐng)求的資源的內(nèi)容特性無(wú)法滿足請(qǐng)求頭中的條件,因而無(wú)法生成響應(yīng)實(shí)體,該請(qǐng)求不可接受射富。
407 Proxy Authentication Required 與401響應(yīng)類似膝迎,只不過(guò)客戶端必須在代理服務(wù)器上進(jìn)行身份驗(yàn)證。
408 Request Timeout 請(qǐng)求超時(shí)胰耗。根據(jù)HTTP規(guī)范限次,客戶端沒(méi)有在服務(wù)器預(yù)備等待的時(shí)間內(nèi)完成一個(gè)請(qǐng)求的發(fā)送,客戶端可以隨時(shí)再次提交這一請(qǐng)求而無(wú)需進(jìn)行任何更改柴灯。
409 Conflict 表示因?yàn)檎?qǐng)求存在沖突無(wú)法處理該請(qǐng)求卖漫,例如多個(gè)同步更新之間的編輯沖突。
410 Gone 表示所請(qǐng)求的資源不再可用赠群,將不再可用羊始。當(dāng)資源被有意地刪除并且資源應(yīng)被清除時(shí),應(yīng)該使用這個(gè)查描。在收到410狀態(tài)碼后突委,用戶應(yīng)停止再次請(qǐng)求資源。但大多數(shù)服務(wù)端不會(huì)使用此狀態(tài)碼冬三,而是直接使用404狀態(tài)碼匀油。
500 Internal Server Error 通用錯(cuò)誤消息,服務(wù)器遇到了一個(gè)未曾預(yù)料的狀況勾笆,導(dǎo)致了它無(wú)法完成對(duì)請(qǐng)求的處理。沒(méi)有給出具體錯(cuò)誤信息匠襟。
501 Not Implemented 服務(wù)器不支持當(dāng)前請(qǐng)求所需要的某個(gè)功能钝侠。當(dāng)服務(wù)器無(wú)法識(shí)別請(qǐng)求的方法,并且無(wú)法支持其對(duì)任何資源的請(qǐng)求酸舍。
502 Bad Gateway 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí)帅韧,從上游服務(wù)器接收到無(wú)效的響應(yīng)。
503 Service Unavailable 由于臨時(shí)的服務(wù)器維護(hù)或者過(guò)載啃勉,服務(wù)器當(dāng)前無(wú)法處理請(qǐng)求忽舟。這個(gè)狀況是暫時(shí)的,并且將在一段時(shí)間以后恢復(fù)淮阐。如果能夠預(yù)計(jì)延遲時(shí)間叮阅,那么響應(yīng)中可以包含一個(gè)Retry-After頭用以標(biāo)明這個(gè)延遲時(shí)間。如果沒(méi)有給出這個(gè)Retry-After信息泣特,那么客戶端應(yīng)當(dāng)以處理500響應(yīng)的方式處理它浩姥。
504 Gateway Timeout 作為網(wǎng)關(guān)或者代理工作的服務(wù)器嘗試執(zhí)行請(qǐng)求時(shí),未能及時(shí)從上游服務(wù)器(URI標(biāo)識(shí)出的服務(wù)器状您,例如HTTP勒叠、FTP兜挨、LDAP)或者輔助服務(wù)器(例如DNS)收到響應(yīng)。注意:某些代理服務(wù)器在DNS查詢超時(shí)時(shí)會(huì)返回400或者500錯(cuò)誤眯分。

關(guān)于狀態(tài)碼詳情參見“維基百科揭秘——HTTP狀態(tài)碼”拌汇;

錯(cuò)誤信息

如果產(chǎn)生錯(cuò)誤,就應(yīng)該向用戶返回出錯(cuò)信息弊决。返回信息中將error作為建明噪舀,出錯(cuò)信息作為鍵值即可。

{
    "error":"Invalid API Key!"
}

返回結(jié)果

針對(duì)不同操作飘诗,服務(wù)器向用戶返回的結(jié)果應(yīng)該符合以下規(guī)范与倡。

GET /collection: 返回資源對(duì)象列表
GET /collection/resource:返回單個(gè)資源對(duì)象
POST /collection:返回新創(chuàng)建的資源對(duì)象
PUT /collection:返回完整的資源對(duì)象
PATCh /collection:返回完整的資源對(duì)象
DELETE /collection:返回一個(gè)空文檔

RESTful不規(guī)范使用

接口中添加GET/UPDATE等動(dòng)詞

在URI中添加操作名稱;而是應(yīng)該通過(guò)http動(dòng)詞表示請(qǐng)求資源的操作動(dòng)作疚察,如:GET/UPDATE,來(lái)表示接口的含義仇奶;

//不規(guī)范使用方法
GET /getUser
POST /updateUser
POST /cowfarm/cowfarmemp/new
POST /cowfarm/cowfarmemp/update
POST /cowfarm/cowfarmemp/delete/{id}

//正確使用方法
GET /user               # 獲取一個(gè)用戶的信息貌嫡;
PUT /user               # 更新用戶的信息;
POST /cowfarm/employee  # 表示 新建一個(gè)農(nóng)場(chǎng)的雇員/員工该溯;
PUT /cowfarm/employee   # 表示 更新農(nóng)場(chǎng)雇員/員工的信息岛抄;
DELETE /cowfarm/employee# body中包含json參數(shù),表示刪除用戶狈茉,且返回值中夫椭,message,code應(yīng)該正常返回氯庆,data就沒(méi)必要返回了

非改動(dòng)資源的操作卻設(shè)計(jì)為POST/PUT等方法

對(duì)于沒(méi)有新增/更新/刪除等去改動(dòng)和影響資源的操作蹭秋,HTTP的方法卻設(shè)計(jì)為POST/PUT等

RESTful API返回?cái)?shù)據(jù)的格式

常用數(shù)據(jù)返回格式為json格式,或者使用比較少的XML堤撵。


  1. 超文本:超文本系統(tǒng)是一種提供了復(fù)雜格式的解釋的軟件系統(tǒng)仁讨,包括文本,圖像实昨,超鏈接一種文字間的跳轉(zhuǎn)以提供某一個(gè)關(guān)鍵詞的相關(guān)內(nèi)容洞豁。 ?

  2. URI:統(tǒng)一資源標(biāo)識(shí)符(英語(yǔ):Uniform Resource Identifier,或URI)是一個(gè)用于標(biāo)識(shí)某一互聯(lián)網(wǎng)資源名稱的字符串荒给≌尚可以這么理解URI=URL+URN;URL(定位符——資源地址)和URN(名稱——資源名稱)方案屬于URI的子類志电,URI可以為URL或URN兩者之一或同時(shí)是URI和URN曙咽。技術(shù)上講,URL和URN屬于資源ID挑辆;但是桐绒,人們往往無(wú)法將某種方案歸類于兩者中的某一個(gè):所有的URI都可被作為名稱看待夺脾,而某些方案同時(shí)體現(xiàn)了兩者中的不同部分。 ? ?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末茉继,一起剝皮案震驚了整個(gè)濱河市咧叭,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌烁竭,老刑警劉巖菲茬,帶你破解...
    沈念sama閱讀 221,576評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異派撕,居然都是意外死亡婉弹,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,515評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門终吼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)镀赌,“玉大人,你說(shuō)我怎么就攤上這事际跪∩谭穑” “怎么了?”我有些...
    開封第一講書人閱讀 168,017評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵姆打,是天一觀的道長(zhǎng)良姆。 經(jīng)常有香客問(wèn)我,道長(zhǎng)幔戏,這世上最難降的妖魔是什么玛追? 我笑而不...
    開封第一講書人閱讀 59,626評(píng)論 1 296
  • 正文 為了忘掉前任,我火速辦了婚禮闲延,結(jié)果婚禮上痊剖,老公的妹妹穿的比我還像新娘。我一直安慰自己垒玲,他們只是感情好邢笙,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,625評(píng)論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著侍匙,像睡著了一般氮惯。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上想暗,一...
    開封第一講書人閱讀 52,255評(píng)論 1 308
  • 那天妇汗,我揣著相機(jī)與錄音,去河邊找鬼说莫。 笑死杨箭,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的储狭。 我是一名探鬼主播互婿,決...
    沈念sama閱讀 40,825評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼捣郊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了慈参?” 一聲冷哼從身側(cè)響起呛牲,我...
    開封第一講書人閱讀 39,729評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎驮配,沒(méi)想到半個(gè)月后娘扩,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,271評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壮锻,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,363評(píng)論 3 340
  • 正文 我和宋清朗相戀三年琐旁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片猜绣。...
    茶點(diǎn)故事閱讀 40,498評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡灰殴,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出掰邢,到底是詐尸還是另有隱情牺陶,我是刑警寧澤,帶...
    沈念sama閱讀 36,183評(píng)論 5 350
  • 正文 年R本政府宣布尸变,位于F島的核電站义图,受9級(jí)特大地震影響减俏,放射性物質(zhì)發(fā)生泄漏召烂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,867評(píng)論 3 333
  • 文/蒙蒙 一娃承、第九天 我趴在偏房一處隱蔽的房頂上張望奏夫。 院中可真熱鬧,春花似錦历筝、人聲如沸酗昼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,338評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)麻削。三九已至,卻和暖如春春弥,著一層夾襖步出監(jiān)牢的瞬間呛哟,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,458評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工匿沛, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留扫责,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,906評(píng)論 3 376
  • 正文 我出身青樓逃呼,卻偏偏與公主長(zhǎng)得像鳖孤,于是被迫代替她去往敵國(guó)和親者娱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,507評(píng)論 2 359

推薦閱讀更多精彩內(nèi)容