簡體   English   中英

使用POST創建新資源的REST方法

[英]REST method to Create new resource using POST

  1. 我想在/ users {“名稱”:“先生。 伍茲”,“年齡”:29}
  2. 我的請求中沒有ID。

  3. 服務器將使用自動生成的ID創建新資源(即使同一數據存在,但ID也不同),例如1234

  4. 必須在響應中返回新的資源位置/ users / 1234

  5. 現在,我是否應該僅將新ID作為響應中的返回值或輸入請求中設置的新ID返回並返回整個實體? {“ id”:1234,“ name”:“ Mr。 伍茲”,“年齡”:29}

  6. 另外,當一個請求到達POST / users但已經在輸入中提供了ID時,我們是否需要在創建一個新請求之前驗證它是否為null? 如果輸入中存在ID,在這種情況下,Http響應代碼是什么?

我將使用spring hateoas( https://spring.io/projects/spring-hateoas )並創建一個像這樣的對象:

public class User extends ResourceSupport {
    private Long id;
    private int age;
    private String name;
    //Setter and getter and eventually hashCode and equals
}

然后在控制器中,我將采用以下方法:

@RequestMapping(value="/users", method={RequestMethod.POST}, produces="application/json")
public ResponseEntity<User> managePerson(@RequestBody User p)
{
  if(p.getId() != null)
  {
    //Update; in this case a 204 http status is enough and no content is required
   Return ResponseEntity.status(HttpStatus.NO_CONTENT).body(null);
  }
  else
  {
   //Save and return the saved objecty with the returned ID and set the new location
   p.add(new Link("/users/"+p.getId()));
   Return ResponseEntity.status(HttpStatus.OK).body(p);
  }

}

現在,我是否應該僅將新ID作為響應中的返回值或輸入請求中設置的新ID返回並返回整個實體? {“ id”:1234,“ name”:“ Mr。 伍茲”,“年齡”:29}

成功的Rest POST請求不一定需要具有響應正文,總的來說,如果這些完全是請求中提供的相同數據+創建的ID。
location header中包含所創建資源的URI的201 Created響應看起來不錯。

這並不意味着禁止在POST響應中設置正文,僅當它為客戶端添加了一些附加值時才應設置它。
例如,假設資源創建可能會更改客戶端提供的數據(清理,計算等),那么在主體響應中設置資源可能是有意義的。

另外,當一個請求到達POST / users但已經在輸入中提供了ID時,我們是否需要在創建一個新請求之前驗證它是否為null? 如果輸入中存在ID,在這種情況下,Http響應代碼是什么?

這取決於您希望Rest服務的行為方式:

  • 無論是你決定的更新是法律與POST :在該ID是否這種情況下null ,創建資源,如果它不是null ,您更新資源,如果一切都很好,你可以返回202 Accepted
  • 或者,您決定使用POST更新是不合法的:在另一種情況下,如果ID不為null ,則會返回錯誤響應,例如400 Bad Request

我的請求中沒有ID。

您不需要一個。 您只需為此使用Db-SDK。

必須在響應中返回新的資源位置/ users / 1234

最好使其成為超媒體驅動的系統HATEOS

現在,我是否應該僅將新ID作為響應中的返回值或輸入請求中設置的新ID返回並返回整個實體? {“ id”:1234,“ name”:“ Mr。 伍茲”,“年齡”:29}

就像我說的那樣,返回完整的超媒體信息是很好的,這樣客戶端可以無需進一步修改即可引用它們,以發出任何輕松的請求

{
    "id": 1234,
    "name": "Mr.Woods",
    "age": 29,
    "address": "/1234/address",
    "some-param": "/path-to-the-resource"
}

另外,當一個請求到達POST / users但已經在輸入中提供了ID時,我們是否需要在創建一個新請求之前驗證它是否為null?

理想情況下,如果遵循HTTP規范,則應對其進行驗證。 發布應始終導致資源的創建。 但是,這只是遵循規范,如果您希望使POST冪等,則不會阻止您

暫無
暫無

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

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