2009-07-09 21 views
1

我正在開發一個REST API的那一刻,和這是核心特性之一使用了各種HTTP狀態代碼,返回狀態/錯誤信息,其中一些可能是擴展的信息(例如,如果一個項目沒有找到,一些其他類似的項目)將在響應主體。發送自定義HTTP錯誤信息給Flash,JavaScript的,等

這很好,直到你找到像Flash和JavaScript這樣的客戶端不能訪問響應主體或頭部,除非HTTP狀態代碼是200 OK(即使是201創建的成功代碼也會導致Flash無法思考這是一個錯誤)。

所以我的問題是,是否有一種標準的方式允許這種類型的客戶端請求所有狀態代碼是HTTP 200,並以另一種方式指示真實狀態代碼?

我想到的一個解決方案是,在HTTP Accept-*標頭系列的模式中,使用X-Accept-Status擴展標頭來指定可以處理哪些狀態碼,例如,閃存就送......

X-Accept-Status: 200 

...然後在此名單將被映射到一個是任何狀態代碼,並在響應體返回的錯誤,可能與另一個擴展頭指示實狀態碼,例如

X-HTTP-Status-Code: 404 Not Found 

這一切似乎有點恐怖,以及對協議的工作,但如果你有不能使用的協議屬性,則客戶這是不可避免的。我只是在尋找的東西有點像X-HTTP-Method-Override(這是周圍的協議工作不能發送PUT/DELETE請求的客戶端的「標準」的方式),但無法理解的狀態代碼客戶端。

回答

2

很好,實際上HTTPREST的問題是,REST是一個很好的主意,和HTTP描述了一個很好的實現它......但實際上,許多客戶端和服務器只實現的HTTP一部分...

我不認爲HTTP是必須的.​​..還是,REST是一個好主意,REST充滿的系統的是一個強大的屬性...那麼,爲什麼不使用HTTP作爲一個愚蠢的傳輸層爲REST FUL系統?

這就是你正在做的事情,雖然在我看來,你對HTTP有點太過分了,它所有的理論上都是內置功能......你真的需要在狀態代碼中傳輸信息嗎?

不取決於你的傳輸協議/層上這麼多......心中有一個明確的想法,你的服務應該是如何工作的?它的實現單獨的協議語義...客戶端和服務器上。 ..抽象你的REST富裕和身份代碼太多(使他們更多,然後只是整數...使它枚舉,或對象...爲什麼不...?)

然後插件協議/運輸層隨意...

  • 做出標準HTTP實現
  • 使哈克一個,使用你所描述的解決方案(這對我來說似乎是完全有效的......如果人們使用的技術無法使用這些標準,爲什麼要打擾太多尋找最符合標準的解決方案)
  • 使您有時間做的任何事情,並且您的服務器能夠做到,二進制,JSON,XML ...無論似乎足以...

兩個技術筆記,雖然:

  1. flash播放器確實是在瀏覽器HTTP交通...它根本沒有得到狀態碼從瀏覽器...以及它取決於瀏覽器其實......規格說明,它不適用於:「用於Macintosh的Netscape,Mozilla,Safari,Opera和Internet Explorer。」 ...所以IE的窗戶應該工作?鉻?我不知道......但我認爲,沒關係,因爲很明顯,你不能依賴它......哦,並且要說明最明顯的情況:當然,JavaScript也會在瀏覽器上執行它的HTTP。 ..所以同樣的問題在這裏...
  2. 這兩個暗示,如果你會成功找到類似X-HTTP-Method-Override的響應,這是內置在協議中,一個好的瀏覽器會明白,並會重新映射相應的東西, 再決定給哪些信息JavaScript或第三方插件...所以你會再次結束了沒有...我想...

,你應該簡單地選擇基於你的響應方法客戶......也許是客戶應該發送一些額外的信息,如果它不能使用HTTP標準...否則拋出它,遵循標準...我首先使用標準HTTP進行實施,但仍然隱藏HTTP本身,並且一次一切正常,使用

格爾茨

back2dos寫一個

0

我錯了,如果認爲不應該讓一個殘缺外的現成潛在客戶的API決定的特徵API實現?我想實際的考慮贏得了一天,但總的來說,我猜我的投票贊成「正確」構建API實現,並需要根據需要定製客戶端編程。

+1

問題是什麼時候客戶端根本沒有辦法使用「正確」構建的應用程序。想象一下與你的經理交談......你:「不,我們不能讓[插入大公司]在API中使用API​​,即使他們會付錢給我們(在這裏插入大量資金),因爲他們無法調用它完美的方式「。老闆:「改變它,讓他們可以稱之爲現在。」 – 2009-07-17 10:50:10

0

位晚了反應,但......

當我實現了一個Flash客戶端API與OpenRasta的早期版本,我已經包含響應代碼和文字,每個發出的請求X-ResponseLine。由於標題默認只有通用標題,因此它們沒有涉及緩存,所以沒有理由對此有Accept/Vary。