2014-09-29 47 views
2

我正在創建一個REST API,其中包含以文件作爲輸入的端點(例如Excel文件),從文件中提取所有電子郵件地址,並返回電子郵件地址列表。什麼是最適合這個端點的HTTP動詞?在語義上,它似乎是一個GET是最好的選擇,但在URL中傳遞文件數據似乎是一個壞主意。對於傳遞文件,POST會更好,但POST意味着將創建數據庫記錄,並且該操作不是冪等的(它是)。哪個HTTP動詞適合處理文件並返回結果?

我意識到這是一個挑剔的語義問題,但肯定其他人會有相同的問題,所以希望答案會很有用。

+0

我不是純粹的REST服務的忠實粉絲的原因之一 - 並非所有的事物都能很好地融入到其中一個類別中。 – 2014-09-29 04:38:41

+1

爲什麼base64編碼? – 2014-09-29 05:35:37

+1

這不是一個冪等操作嗎?如果您多次提供相同的輸入文件,您是否每次都收到不同的電子郵件地址列表?如果是這樣,你的問題中沒有描述變化的部分... – 2014-09-29 06:39:09

回答

1

POST並不意味着冪等性,也不意味着創建數據庫記錄。

確實,如果不需要使用POST來獲得 idempotent和save,但現在沒有更好的HTTP方法。

1

討論有點迂腐,但我的2C是PUTPUT是一個冪等動詞,並且暗示它將僅在正在運行的資源PUT上運行。但是,RFC 2616建議服務器必須發送301重定向到結果。

從RFC 2616

所述POST的根本區別和PUT請求反映在Request-URI中的不同的含義。 POST請求中的URI標識將處理封閉實體的資源。該資源可能是數據接受過程,其他協議的入口或接受註釋的獨立實體。相比之下,PUT請求中的URI標識請求附帶的實體 - 用戶代理知道URI的目標是什麼,服務器不能嘗試將請求應用於其他資源。如果服務器希望將該請求應用於不同的URI,則它必須發送301(永久移動)響應;如果服務器希望將該請求應用於不同的URI,則它必須發送301(永久移動)響應;如果服務器希望該請求被應用於不同的URI,用戶代理可以自行決定是否重定向請求。

當然,正如Julian如此禮貌地指出的那樣,RFC 2616已經被RFC 2731所廢棄,它沒有這樣的要求。

YMMV。事實上,只要做對你有意義的事情似乎是有道理的。

+0

「RFC」是RFC 7231;既不是它也不是RFC 2616說它需要301. – 2014-09-29 05:35:15

+0

感謝您的答案。實際上,您引用的規範表明使用POST會更合適:「該資源可能是數據接受過程」。 – 2014-09-29 15:03:56

0

不要掛在這上面。一旦做出決定,這種事情就無關緊要。就我個人而言,我會堅持發佈不屬於「CRUD」語義的任何內容。哎呀,如果你設計的是SOAP或WCF服務,你可能不會考慮這個決定,這也是我不重視RESTful模型設計的一個原因,除非有特定的要求才能這樣做,以便互操作。否則,我會設計一個服務合約的SOA,這是合理的,而不用考慮它屬於哪個運輸動詞。

0

我認爲在PUT RFC的關鍵句是這樣的:

A successful PUT of a given 
representation would suggest that a subsequent GET on that same 
target resource will result in an equivalent representation being 
sent in a 200 (OK) response. 

。在你使用的情況下沒有這樣的預期(除非用戶預計將投入到不同的URL對每個不同的Excel和保存每個響應)。它似乎很好地落入了在同一個RFC中爲POST描述的「數據處理資源」。

相關問題