http://www.oschina.net/translate/put-or-posthtml
http://my.oschina.net/u/1263964/blog/268932前端
這兩個方法咋一看均可以更新資源,可是有本質區別的程序員
具體定義能夠百度,我這裏就不貼了,光說我本身的理解web
首先解釋冪等,冪等是數學的一個用語,對於單個輸入或者無輸入的運算方法,若是每次都是一樣的結果,則稱其是冪等的數據庫
對於兩個參數,若是傳入值相等,結果也等於每一個傳入值,則稱其爲冪等的,如min(a,b)django
POSTapi
用於提交請求,能夠更新或者建立資源,是非冪等的瀏覽器
舉個例子,在咱們的支付系統中,一個api的功能是建立收款金額二維碼,它和金額相關,每一個用戶能夠有多個二維碼,若是連續調用則會建立新的二維碼,這個時候就用POST緩存
PUT安全
用於向指定的URI傳送更新資源,是冪等的
仍是那個例子,用戶的帳戶二維碼只和用戶關聯,並且是一一對應的關係,此時這個api就能夠用PUT,由於每次調用它,都將刷新用戶帳戶二維碼
好比一個接口用於用戶生成,接收的數據是用戶名、密碼等相關信息,則用POST
RESTful建議全部的URI都是對應資源,因此建立用戶不該該理解爲一個行爲,在此將此接口命名爲:
/user/creation
每次調用它都會新建一個用戶(假定用戶名能夠重複)
而PUT方法更加關心一個具體資源對應的URI,好比更新當前用戶信息,這裏能夠用PUT
/user/me/update
這裏用me來指代當前用戶,若是是針對更多用戶適用的接口,能夠考慮
/user/{uid}/update
注意屢次調用同一接口,只要提交的數據一致,用戶信息每次結果就會一致,即產生一樣的結果:服務器端某個具體的資源獲得了更新
當須要以更新的形式來修改某一具體資源的時候,如何判斷用PUT仍是POST呢?
很簡單,若是該更新對應的URI屢次調用的結果一致,則PUT
好比更新某個blog文章,由於該文章具備單一的具體URI,因此每次更新提交相同的內容,結果都一致
/blog/{document_id}/update
在每次更新提交相同的內容,最終的結果不一致的時候,用POST
舉個很常見的例子,一個接口的功能是將當前餘額減一個值,每次提交指定該值爲100,接口以下
/amount/deduction
調用一次,你的餘額-100,調用兩次,餘額-200
這個時候就用POST
RESTful的4種層次
Representational status transfer
我的理解爲:表現形式的狀態傳遞
一、只有一個接口交換xml來實現整個服務
目前咱們的移動站點的服務就是相似的結構,咱們有兩個URI接口/mapp/lead和/msdk/safepay
二、每個資源對應一個具體的URI,比1好維護,可是問題依然很明顯,資源版本更新會引入時間戳維護,資源的獲取和更新修改必須對應不一樣的URI
目前PC主站和移動站點的靜態內容(包括html文件)都是這種形式
三、在2的基礎上使用了http verb,每一個URI能夠有不一樣的動做,充分利用了http協議,因此天然竟然http協議的完整優點,好比緩存和健壯性
HTML4.0只支持POST和GET,因此不管DELETE仍是PUT操做,都用POST去模擬了
在WEB開發者看來,就是若是有數據變更,就用POST,若是沒有,就用GET
因此目前中國用戶來看,PC端實現RESTful很困難,只有移動端支持Html5的瀏覽器,才能讓前端作出嘗試
四、如今彷佛更加沒法實際應用,Hypemedia control,也就是RESTful的本意,合理的架構原理和以網絡爲基礎的設計相結合,帶來一個更加方便、功能強大的通訊架構
這就有點虛無縹緲了,不過是一個努力的方向,想一想看,之後要繳水費了,打開瀏覽器,輸入我要繳水費,就自動定位+自動下單+自動付款+自動展現結果,完成整個繳水費的過程,這是多麼方便的領悟!gwy要失業了有木有,那幫吃白飯作很簡單的事情的,生產力發展第1個要淘汰的就是阻礙生產力發展的落後生產關係……
=================================
By 靈魂碼者 at 2013-05-20 08:15
表徵狀態轉移(英文:Representational State Transfer,簡稱REST)是Roy Fielding博士在2000年他的博士論文中提出來的一種軟件架構風格。
目前在三種主流的Web服務實現方案中,由於REST模式的Web服務與複雜的SOAP和XML-RPC對比來說明顯的更加簡潔,愈來愈多的web服務開始採用REST風格設計和實現。例如,Amazon.com提供接近REST風格的Web服務進行圖書查找;雅虎提供的Web服務也是REST風格的。
應該是,作WEB服務,都必須掌握REST哦~~
Rest模式有四種操做,
POST /uri 建立
DELETE /uri/xxx 刪除
PUT /uri/xxx 更新或建立
GET /uri/xxx 查看
GET操做是安全的。所謂安全是指無論進行多少次操做,資源的狀態都不會改變。好比我用GET瀏覽文章,無論瀏覽多少次,那篇文章還在那,沒有變化。固然,你可能說每瀏覽一次文章,文章的瀏覽數就加一,這不也改變了資源的狀態麼?這並不矛盾,由於這個改變不是GET操做引發的,而是用戶本身設定的服務端邏輯形成的。
PUT,DELETE操做是冪等的。所謂冪等是指無論進行多少次操做,結果都同樣。好比我用PUT修改一篇文章,而後在作一樣的操做,每次操做後的結果並無不一樣,DELETE也是同樣。順便說一句,由於GET操做是安全的,因此它天然也是冪等的。
POST操做既不是安全的,也不是冪等的,好比常見的POST重複加載問題:當咱們屢次發出一樣的POST請求後,其結果是建立出了若干的資源。
安全和冪等的意義在於:當操做沒有達到預期的目標時,咱們能夠不停的重試,而不會對資源產生反作用。從這個意義上說,POST操做每每是有害的,但不少時候咱們仍是不得不使用它。
還有一點須要注意的就是,建立操做可使用POST,也可使用PUT,區別在於POST 是做用在一個集合資源之上的(/uri),而PUT操做是做用在一個具體資源之上的(/uri/xxx),再通俗點說,若是URL能夠在客戶端肯定,那麼就使用PUT,若是是在服務端肯定,那麼就使用POST,好比說不少資源使用數據庫自增主鍵做爲標識信息,而建立的資源的標識信息究竟是什麼只能由服務端提供,這個時候就必須使用POST。
關於GET POST 的混淆
先說相同點,只有瞭解了相同點以後才能理解爲何會發生混淆。二者都能向服務器發送數據,提交的「內容」[注1]的格式相同,都是var_1=value_1&var_2=value_2&....get 和 post 區別如字面,一個是get(獲取),一個是post(發送)。get用來告訴服務器須要獲取哪些內容(uri+query),向靜態頁面(uri)請求則直接返回文件內容給瀏覽器,向一個動態頁面請求時能夠提供查詢參數(query)以得到相應內容。post用來向服務器提交內容,主要是爲了提交,而不是爲了請求內容,就是說post的初衷並不要求服務器返回內容[注2],只是提交內容讓服務器處理(主要是存儲或者處理以後再存儲)。get和post出現混淆是由於對提交的數據處理方法的濫用形成的,數據是無辜的。
混淆之一: 將get提交的用來查詢的字段看成是存儲數據存入了服務器端文件或者數據庫。而後就誤覺得get是用來提交用於存儲的數據的。
混淆之二: 編寫腳本在服務器端經過處理post提交的數據並返回內容。只要有數據,就能用來進行判斷,腳本怎寫是程序員的事,而不在意數據來源的形式(post、get,或者是本身預設值的常量)。這點功能上確實沒問題,只是背離的其初始目的而已。
因爲都是要傳送數據,且數據格式相同(即便數據格式不一樣,只要能提取出相應數據)。使用的時候不免出現張冠李戴,將get數據用來存儲、將post數據用來檢索返回數據。可是兩者仍是有區別的(主要是根據其用途而「人爲」[注3]形成的),get的長度限制在2048字節(由瀏覽器和服務器限制的,這是目前IE的數據,曾經是1024字節),很大程度上限制了get用來傳遞「存儲數據」的數據的能力,因此仍是老老實實用來作檢索吧;post則無此限制(只是HTTP協議規範沒有進行大小限制,但受限於服務器的處理能力),所以對於大的數據(通常來講須要存儲的數據可能會比較大,比2048字節大)的傳遞有自然的優點,誰讓它是 nature born post 呢。
get提交的數據是放在url裏,目的是靈活的向服務其提交檢索請求,能夠在地址欄隨時修改數據以變動須要獲取的內容,好比直接修改分頁的編號就跳到另一個分頁了(固然也多是 404)。post提交的數據放在http請求的正文裏,目的在於提交數據並用於服務器端的存儲,而不容許用戶過多的更改相應數據(主要是相對於在url 修改要麻煩不少,url的修改只要點擊地址欄輸入字符就能夠了),除非是專門跑來編輯數據的。
花邊:post和get的安全性在傳輸的層面上區別不大,可是採用url提交數據的get方式容易被人肉眼看到,或者出如今歷史紀錄裏,仍是可能被肉眼看到,都是一些本地的問題。
注1:我強調的是內容,至於http協議中的get和post的格式你們有興趣就本身看看吧。
注2:get方式主要是爲了得到預期內容,即uri+query相同時所獲得的內容應該是相同的。而post主要是提交內容,至因而否有必要返回頁面可能只是出於用戶體驗,好比註冊時返回你的註冊id,可是若是隻是返回一個「您已註冊成功」的相同頁面(即便你post的數據不同)也沒什麼好奇怪的。
注3:關於這個「人爲」,不是那麼貼切,get和post仍是有技術層面的區別的。可是從表象上看暫且這麼說吧,畢竟兩者的混淆也是「人爲」的。
======================
http://www.restapitutorial.com/lessons/httpmethods.html
The HTTP verbs comprise a major portion of our 「uniform interface」 constraint and provide us the action counterpart to the noun-based resource. The primary or most-commonly-used HTTP verbs (or methods, as they are properly called) are POST, GET, PUT, PATCH, and DELETE. These correspond to create, read, update, and delete (or CRUD) operations, respectively. There are a number of other verbs, too, but are utilized less frequently. Of those less-frequent methods, OPTIONS and HEAD are used more often than others.
Below is a table summarizing recommended return values of the primary HTTP methods in combination with the resource URIs:
HTTP Verb | CRUD | Entire Collection (e.g. /customers) | Specific Item (e.g. /customers/{id}) |
---|---|---|---|
POST | Create | 201 (Created), 'Location' header with link to /customers/{id} containing new ID. | 404 (Not Found), 409 (Conflict) if resource already exists.. |
GET | Read | 200 (OK), list of customers. Use pagination, sorting and filtering to navigate big lists. | 200 (OK), single customer. 404 (Not Found), if ID not found or invalid. |
PUT | Update/Replace | 404 (Not Found), unless you want to update/replace every resource in the entire collection. | 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. |
PATCH | Update/Modify | 404 (Not Found), unless you want to modify the collection itself. | 200 (OK) or 204 (No Content). 404 (Not Found), if ID not found or invalid. |
DELETE | Delete | 404 (Not Found), unless you want to delete the whole collection—not often desirable. | 200 (OK). 404 (Not Found), if ID not found or invalid. |
Below is a more-detailed discussion of the main HTTP methods. Click on a tab for more information about the desired HTTP method.
The POST verb is most-often utilized to **create** new resources. In particular, it's used to create subordinate resources. That is, subordinate to some other (e.g. parent) resource. In other words, when creating a new resource, POST to the parent and the service takes care of associating the new resource with the parent, assigning an ID (new resource URI), etc.
On successful creation, return HTTP status 201, returning a Location header with a link to the newly-created resource with the 201 HTTP status.
POST is neither safe nor idempotent. It is therefore recommended for non-idempotent resource requests. Making two identical POST requests will most-likely result in two resources containing the same information.
Examples: