日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

HTTP 幂等性

發(fā)布時間:2023/12/14 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 HTTP 幂等性 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

http://www.cnblogs.com/weidagang2046/archive/2011/06/04/2063696.html

Todd.log - a place to keep my thoughts on programming

理解HTTP冪等性

基于HTTP協(xié)議的Web API是時下最為流行的一種分布式服務(wù)提供方式。無論是在大型互聯(lián)網(wǎng)應(yīng)用還是企業(yè)級架構(gòu)中,我們都見到了越來越多的SOA或RESTful的Web API。為什么Web API如此流行呢?我認(rèn)為很大程度上應(yīng)歸功于簡單有效的HTTP協(xié)議。HTTP協(xié)議是一種分布式的面向資源的網(wǎng)絡(luò)應(yīng)用層協(xié)議,無論是服務(wù)器端提供Web服務(wù),還是客戶端消費Web服務(wù)都非常簡單。再加上瀏覽器、Javascript、AJAX、JSON以及HTML5等技術(shù)和工具的發(fā)展,互聯(lián)網(wǎng)應(yīng)用架構(gòu)設(shè)計表現(xiàn)出了從傳統(tǒng)的PHP、JSP、ASP.NET等服務(wù)器端動態(tài)網(wǎng)頁向Web API + RIA(富互聯(lián)網(wǎng)應(yīng)用)過渡的趨勢。Web API專注于提供業(yè)務(wù)服務(wù),RIA專注于用戶界面和交互設(shè)計,從此兩個領(lǐng)域的分工更加明晰。在這種趨勢下,Web API設(shè)計將成為服務(wù)器端程序員的必修課。然而,正如簡單的Java語言并不意味著高質(zhì)量的Java程序,簡單的HTTP協(xié)議也不意味著高質(zhì)量的Web API。要想設(shè)計出高質(zhì)量的Web API,還需要深入理解分布式系統(tǒng)及HTTP協(xié)議的特性。

冪等性定義

本文所要探討的正是HTTP協(xié)議涉及到的一種重要性質(zhì):冪等性(Idempotence)。在HTTP/1.1規(guī)范中冪等性的定義是:

Methods can also have the property of "idempotence" in that (aside from error or expiration issues) the side-effects of N > 0 identical requests is the same as for a single request.

從定義上看,HTTP方法的冪等性是指一次和多次請求某一個資源應(yīng)該具有同樣的副作用。冪等性屬于語義范疇,正如編譯器只能幫助檢查語法錯誤一樣,HTTP規(guī)范也沒有辦法通過消息格式等語法手段來定義它,這可能是它不太受到重視的原因之一。但實際上,冪等性是分布式系統(tǒng)設(shè)計中十分重要的概念,而HTTP的分布式本質(zhì)也決定了它在HTTP中具有重要地位。

分布式事務(wù) vs 冪等設(shè)計

為什么需要冪等性呢?我們先從一個例子說起,假設(shè)有一個從賬戶取錢的遠(yuǎn)程API(可以是HTTP的,也可以不是),我們暫時用類函數(shù)的方式記為:

bool withdraw(account_id, amount)

withdraw的語義是從account_id對應(yīng)的賬戶中扣除amount數(shù)額的錢;如果扣除成功則返回true,賬戶余額減少amount;如果扣除失敗則返回false,賬戶余額不變。值得注意的是:和本地環(huán)境相比,我們不能輕易假設(shè)分布式環(huán)境的可靠性。一種典型的情況是withdraw請求已經(jīng)被服務(wù)器端正確處理,但服務(wù)器端的返回結(jié)果由于網(wǎng)絡(luò)等原因被掉丟了,導(dǎo)致客戶端無法得知處理結(jié)果。如果是在網(wǎng)頁上,一些不恰當(dāng)?shù)脑O(shè)計可能會使用戶認(rèn)為上一次操作失敗了,然后刷新頁面,這就導(dǎo)致了withdraw被調(diào)用兩次,賬戶也被多扣了一次錢。如圖1所示:

圖1

這個問題的解決方案一是采用分布式事務(wù),通過引入支持分布式事務(wù)的中間件來保證withdraw功能的事務(wù)性。分布式事務(wù)的優(yōu)點是對于調(diào)用者很簡單,復(fù)雜性都交給了中間件來管理。缺點則是一方面架構(gòu)太重量級,容易被綁在特定的中間件上,不利于異構(gòu)系統(tǒng)的集成;另一方面分布式事務(wù)雖然能保證事務(wù)的ACID性質(zhì),而但卻無法提供性能和可用性的保證。

另一種更輕量級的解決方案是冪等設(shè)計。我們可以通過一些技巧把withdraw變成冪等的,比如:

int create_ticket() bool idempotent_withdraw(ticket_id, account_id, amount)

create_ticket的語義是獲取一個服務(wù)器端生成的唯一的處理號ticket_id,它將用于標(biāo)識后續(xù)的操作。idempotent_withdraw和withdraw的區(qū)別在于關(guān)聯(lián)了一個ticket_id,一個ticket_id表示的操作至多只會被處理一次,每次調(diào)用都將返回第一次調(diào)用時的處理結(jié)果。這樣,idempotent_withdraw就符合冪等性了,客戶端就可以放心地多次調(diào)用。

基于冪等性的解決方案中一個完整的取錢流程被分解成了兩個步驟:1.調(diào)用create_ticket()獲取ticket_id;2.調(diào)用idempotent_withdraw(ticket_id, account_id, amount)。雖然create_ticket不是冪等的,但在這種設(shè)計下,它對系統(tǒng)狀態(tài)的影響可以忽略,加上idempotent_withdraw是冪等的,所以任何一步由于網(wǎng)絡(luò)等原因失敗或超時,客戶端都可以重試,直到獲得結(jié)果。如圖2所示:

圖2

和分布式事務(wù)相比,冪等設(shè)計的優(yōu)勢在于它的輕量級,容易適應(yīng)異構(gòu)環(huán)境,以及性能和可用性方面。在某些性能要求比較高的應(yīng)用,冪等設(shè)計往往是唯一的選擇。

HTTP的冪等性

HTTP協(xié)議本身是一種面向資源的應(yīng)用層協(xié)議,但對HTTP協(xié)議的使用實際上存在著兩種不同的方式:一種是RESTful的,它把HTTP當(dāng)成應(yīng)用層協(xié)議,比較忠實地遵守了HTTP協(xié)議的各種規(guī)定;另一種是SOA的,它并沒有完全把HTTP當(dāng)成應(yīng)用層協(xié)議,而是把HTTP協(xié)議作為了傳輸層協(xié)議,然后在HTTP之上建立了自己的應(yīng)用層協(xié)議。本文所討論的HTTP冪等性主要針對RESTful風(fēng)格的,不過正如上一節(jié)所看到的那樣,冪等性并不屬于特定的協(xié)議,它是分布式系統(tǒng)的一種特性;所以,不論是SOA還是RESTful的Web API設(shè)計都應(yīng)該考慮冪等性。下面將介紹HTTP GET、DELETE、PUT、POST四種主要方法的語義和冪等性。

HTTP GET方法用于獲取資源,不應(yīng)有副作用,所以是冪等的。比如:GET http://www.bank.com/account/123456,不會改變資源的狀態(tài),不論調(diào)用一次還是N次都沒有副作用。請注意,這里強調(diào)的是一次和N次具有相同的副作用,而不是每次GET的結(jié)果相同。GET http://www.news.com/latest-news這個HTTP請求可能會每次得到不同的結(jié)果,但它本身并沒有產(chǎn)生任何副作用,因而是滿足冪等性的。

HTTP DELETE方法用于刪除資源,有副作用,但它應(yīng)該滿足冪等性。比如:DELETE http://www.forum.com/article/4231,調(diào)用一次和N次對系統(tǒng)產(chǎn)生的副作用是相同的,即刪掉id為4231的帖子;因此,調(diào)用者可以多次調(diào)用或刷新頁面而不必?fù)?dān)心引起錯誤。

比較容易混淆的是HTTP POST和PUT。POST和PUT的區(qū)別容易被簡單地誤認(rèn)為“POST表示創(chuàng)建資源,PUT表示更新資源”;而實際上,二者均可用于創(chuàng)建資源,更為本質(zhì)的差別是在冪等性方面。在HTTP規(guī)范中對POST和PUT是這樣定義的:

The POST method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line ...... If a resource has been created on the origin server, the response SHOULD be 201 (Created) and contain an entity which describes the status of the request and refers to the new resource, and a Location header.

The PUT method requests that the enclosed entity be stored under the supplied Request-URI. If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a modified version of the one residing on the origin server. If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that URI.

POST所對應(yīng)的URI并非創(chuàng)建的資源本身,而是資源的接收者。比如:POST http://www.forum.com/articles的語義是在http://www.forum.com/articles下創(chuàng)建一篇帖子,HTTP響應(yīng)中應(yīng)包含帖子的創(chuàng)建狀態(tài)以及帖子的URI。兩次相同的POST請求會在服務(wù)器端創(chuàng)建兩份資源,它們具有不同的URI;所以,POST方法不具備冪等性。而PUT所對應(yīng)的URI是要創(chuàng)建或更新的資源本身。比如:PUT http://www.forum/articles/4231的語義是創(chuàng)建或更新ID為4231的帖子。對同一URI進行多次PUT的副作用和一次PUT是相同的;因此,PUT方法具有冪等性。

在介紹了幾種操作的語義和冪等性之后,我們來看看如何通過Web API的形式實現(xiàn)前面所提到的取款功能。很簡單,用POST /tickets來實現(xiàn)create_ticket;用PUT /accounts/account_id/ticket_id&amount=xxx來實現(xiàn)idempotent_withdraw。值得注意的是嚴(yán)格來講amount參數(shù)不應(yīng)該作為URI的一部分,真正的URI應(yīng)該是/accounts/account_id/ticket_id,而amount應(yīng)該放在請求的body中。這種模式可以應(yīng)用于很多場合,比如:論壇網(wǎng)站中防止意外的重復(fù)發(fā)帖。

總結(jié)

上面簡單介紹了冪等性的概念,用冪等設(shè)計取代分布式事務(wù)的方法,以及HTTP主要方法的語義和冪等性特征。其實,如果要追根溯源,冪等性是數(shù)學(xué)中的一個概念,表達(dá)的是N次變換與1次變換的結(jié)果相同,有興趣的讀者可以從Wikipedia上進一步了解。

參考

RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1, Method Definitions
The Importance of Idempotence
Stackoverflow - PUT vs POST in REST

?


總結(jié)

以上是生活随笔為你收集整理的HTTP 幂等性的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 中文字幕av免费观看 | 少妇视频在线播放 | 成年人午夜 | 国产亚洲欧美在线精品 | 日韩少妇一区二区三区 | 欧美日韩精品一二三区 | 国产真实伦对白全集 | 欧美性猛交乱大交3 | 亚洲精选久久 | 综合色亚洲 | 激情综合一区二区三区 | 深夜激情影院 | 一区二区三区在线不卡 | 欧美操穴视频 | 色婷婷精品国产一区二区三区 | 成年人免费在线观看网站 | 日日日日日日bbbbbb | 亚洲女同女同女同女同女同69 | 三级性生活视频 | 国产黄色免费看 | 美女视频黄色在线观看 | www黄色网址 | 精品人妻人伦一区二区有限公司 | 欧美一级做a爰片久久高潮 久热国产精品视频 | 欧美怡红院 | 午夜之声l性8电台lx8电台 | 青在线视频 | 美女一级 | 天天鲁| 欧亚一区二区三区 | 亚洲视频一二三区 | 日韩亚洲欧美一区二区三区 | 成人夜晚看av | 大片视频免费观看视频 | 国产69精品久久久久久 | 亚洲iv一区二区三区 | 精品视频99 | 久久久网 | 午夜免费播放观看在线视频 | 久久福利小视频 | www.四虎精品 | 2022av视频| 动漫美女放屁 | 一本一道人人妻人人妻αv 九一在线视频 | 天天干夜夜操 | 欧美精品在线一区二区三区 | 中文字幕无码乱码人妻日韩精品 | 欧美日韩国产一区 | 一区二区在线视频免费观看 | 三级小视频在线观看 | 精品一区在线播放 | www.一起操| 艳妇臀荡乳欲伦交换电影 | 一级免费毛片 | 日本欧美一区二区三区不卡视频 | 国产伦精品一区二区三区高清版 | 夜夜操网址| 中国在线观看免费高清视频播放 | 光棍影院手机版在线观看免费 | 毛片的网站 | 亚洲国产日韩欧美一区二区三区 | 91香蕉视频黄 | 激情片 | 国产精品亚洲成在人线 | 扒丝袜| 狠狠爱夜夜操 | 亚洲av永久纯肉无码精品动漫 | 啪啪av网| 国产又粗又猛又爽又黄 | 色成人亚洲 | 岛国精品 | www.超碰97| 国产欧美日韩专区 | 日韩理论在线观看 | 国产美女无遮挡永久免费观看 | 亚洲爱av | 精品国产影院 | 欧美综合视频 | 手机看片久久久 | 69国产| 能看的av | 在线免费观看黄色网址 | 国产精品污污 | 日韩黄色一区二区 | 97人妻天天摸天天爽天天 | 精东影业一区二区三区 | 色网站女女 | 欧美7777 | 国产乱码精品一品二品 | 免费在线观看黄色片 | 国产欧美二区 | 91看片黄色 | 成人免费在线网站 | 影音先锋丝袜美腿 | 浪浪视频污 | 看片免费黄在线观看入口 | 图片一区二区 | 日韩aⅴ在线观看 | porn亚洲|