簡體   English   中英

如何在REST API中正確使用HTTP請求方法?

[英]How to use HTTP request methods correctly in REST APIs?

在搜尋以了解HTTP請求方法(尤其是PUT)以來,我發現它全都用錯了,我偶然發現了很多引號,它們指出“ PUT不屬於REST API”“一個人只能使用GET和POST”在現代API中”

這讓我感到奇怪,為什么不在REST API中使用PUT或PATCH或DELETE等? 這不是他們的目的嗎? 因為它們有助於語義和結構等原因而被使用?

可能與接收請求的方法有關,例如主要是將數據定向到其他方法(如數據庫方法)的方法,然后再處理這些方法? 我想更新文檔時使用了PUT,但是即使我只向其中發送了部分數據,也從未覆蓋過它。

下面有一個使用Express和MongoDB的示例(顯示Express中的put方法)。

app.put('/users/:id', (req, res, next) => {
    let id = req.params.id;
    userService.getOneUser({_id: ObjectID(id)}).then((user) => {

        let updatedData = req.body;

        userService.updateUser(user._id, updatedData)
           .then((doc) => res.json(doc))
           .catch((err) => errorHandler(err, res, next));

    }).catch((err) => errorHandler(err, res, next));
})

基本上,我的問題是:關於上述陳述,您如何在REST API中正確使用這些方法,以及何時使用它們?

編輯:關於兩個引用的示例:

PUT不屬於REST API

僅使用GET和POST-請參閱問題的第三條評論

我偶然發現了很多引號,它們表示“ PUT不屬於REST API”和“一個人應僅在現代API中使用GET和POST”。

我不會在這些引號中放很多股票-它們表示缺乏對REST,HTTP以及所有內容應該如何組合的理解。

我建議從吉姆·韋伯開始,他確實有很好的理解。

HTTP是一種應用協議,其應用域是通過網絡傳輸文檔。

PUT,PATCH,DELETE都是描述文檔更改的完美方法。 我從您那里GET一個文檔,我使用我最喜歡的HTTP感知編輯器/庫對文檔進行更改,我向您發送了一個描述我對文檔所做更改的請求,您可以弄清楚該怎么做。

這讓我感到奇怪,為什么不在REST API中使用PUT或PATCH或DELETE等? 這不是他們的目的嗎? 因為它們有助於語義和結構等原因而被使用?

您可能不這樣做的一個原因:您選擇的媒體類型是HTML-HTML具有對鏈接(GET)和表單(GET / POST)的本機支持,但是在涉及其他方法時並沒有很多直接支持。流。 您可以將按需代碼用於支持它的那些客戶端。

可能與接收請求的方法有關,例如主要是將數據定向到其他方法(如數據庫方法)的方法,然后再處理這些方法? 我想更新文檔時使用了PUT,但是即使我只向其中發送了部分數據,也從未覆蓋過它。

了解HTTP方法的重要一件事是它們描述的是語義,而不是實現。 這是2002年菲爾德寫作

HTTP不會嘗試要求GET的結果是安全的。 這樣做要求操作的語義是安全的,因此,如果發生任何導致財產損失的結果,那是實現的錯,而不是接口或該接口的用戶

PUT的特定情況下,還可以進一步暗示語義的含義

給定表示的成功PUT建議,在同一目標資源上進行后續GET將導致在200(OK)響應中發送等效表示。 但是,不能保證可以觀察到這種狀態變化。

我認為Triynko提出了一個很好的觀點:

大多數現代應用程序中標識的URI並非要替換,更新等的資源。它們不是文檔。 他們被稱為程序。

如果您要創建以過程為中心的API,而不是以資源為中心的API,則很有可能PUT / PATCH / DELETE並未真正提供證明額外復雜性的好處。

提示您以過程為中心:您對緩存無效化有多大的關注? 接受“統一接口”約束的部分原因是您希望通用組件可以提供的功能,而在HTTP中, 緩存非常重要。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM