2017-10-11 83 views
0

我使用PUT和POST發展彈簧安置網服務PUT和POST - 它們是否依賴於實現?

@RequestMapping(value = "/test", method = RequestMethod.POST) 
@Override 
public String function(Model model) 
{ 
} 

那麼,什麼是在這種情況下使用PUT和POST之間的區別?

我知道PUT是冪等的,這意味着如果多次調用相同的url,效果應該是相同的。 如果我提供的請求方法爲PUT,並且如果我在函數內部包含DB操作,PUT的含義不會改變,這意味着如果我多次調用測試URL,DB值每次都會改變。

我的問題是冪等性,狀態改變,所有這些功能取決於開發人員的實現?

更好的例子:

@RequestMapping(value = "/test", method=RequestMethod.POST, produces={"application/json"}) 
public @ResponseBody List<Integer> postData(@RequestParam String name) {   

    if (name.equalsIgnoreCase("okkk")) { 
     return returnDataList(); 
    }else { 
     List<Integer> list = new ArrayList<Integer>(); 
     list.add(12345); 
     return list; 
    } 
} 

@RequestMapping(value = "/test/{name}", method=RequestMethod.PUT, produces={"application/json"}) 
public @ResponseBody List<Integer> putData(@PathVariable String name) {  

    if (name.equalsIgnoreCase("okkk")) { 
     return returnDataList(); 
    }else { 
     List<Integer> list = new ArrayList<Integer>(); 
     list.add(12345); 
     return list; 
    } 

兩種方法都是一樣的,我相信。我只是把PUT和POST,有點困惑。

回答

1

下面是對此最好的回答:What's the difference between a POST and a PUT HTTP REQUEST?

無論多少次的說就是把它稱爲應一遍又一遍做同樣的事情。 PUT響應不可緩存。

POST允許Web服務器決定如何處理數據。假設「服務器設置了適當的Cache-Control和Expires Headers」,這些請求可以被緩存。

有,我相信可以幫助其他資源:PUT vs. POST in REST

筆者總結了那裏非常漂亮,當使用POST以及何時使用PUT。我選擇了什麼應該是最簡單的:

POST:用於修改和更新資源。

PUT:用於創建資源或覆蓋資源。

+0

「無論PUT被調用多少次,它都應該一次又一次地做同樣的事情.PUT響應不可緩存」意思是說,如果我使用PUT進行數據庫操作,它應該更新一次嗎? – parameswar

+0

你可以用PUT,POST,GET等技術上做你想做的事情。所以如果你想寫PUT來實際返回一個項目列表,你可以這樣做,如果你想。如果你這樣做,但你沒有遵循RESTful實現。 – FooBar

+0

增加了一個例子,你可以檢查嗎? – parameswar

0

冪等性,狀態改變,所有這些特性是否取決於開發者的實現?

是的,由開發人員以符合HTTP規範的方式實現PUT和POST。如果您沒有這樣做,您的服務可能仍然有效,但您很可能會遇到意外問題(例如,從代理服務器訪問時,您的服務可能會表現得異常)。

如果我在函數內部包含一個DB操作,PUT的含義會不會改變?

只要效果是冪等的,就可以在處理PUT請求時執行數據庫操作。

  1. 檢查:

    例如,如果你的服務讓客戶使用要求創建文件,如PUT /myfile在體內通過所需的內容,你可以使用一個數據庫事務,做如下處理每個請求指定的文件已經存在

  2. 如果它已經存在,更新其內容,並與200響應(OK)
  3. 否則,創建該文件,並與201(創建)
0迴應

這是冪等的,因爲如果第二次執行相同的請求,數據庫的狀態不會改變。

對於非冪等,例如,假設第2步變更爲下述:

  • 如果它已經存在,追加新的內容到現有內容
  • 這不是冪等的,因爲如果客戶端發送兩次相同的請求,則該文件將具有兩個內容副本。