2011-07-29 141 views
4

我正在爲我的web項目(PHP)設計一個API,但在建模資源與屬性之間的關係時遇到麻煩。我想就如何繼續進行一些輸入。REST風格的API設計(資源連接)

資源:

  • 用戶。
    • Id。
    • 名稱。
    • 狗(關係)。
      • Id。
      • 私人(是或否)。
  • 狗。
    • Id。
    • 名稱。

關係:

  • 多對多。
    • 一個用戶可以有很多狗。
    • 一隻狗可以屬於許多用戶。
  • 這種關係可以是私人的或公共的。

您想如何更新關係的「私人」屬性?

現在你必須發送一個PUT請求.../API /用戶/ {} userId的包括用戶的所有關係,包括更新的屬性:

(名稱可以爲空 - >不更新)

  • 狗:
    • 狗。
      • ID:DogA。
      • 私人:是的。
    • 狗。
      • ID:DogB。
      • 私人:第(更新)

,因爲我相信,只有已更改的信息應該需要發送更新我感覺不舒服這種方法。因此我現在的想法是增加對只發送更新的關係的支持....../ api/users/{userId}:

  • 狗。
    • 狗。
      • ID:DogB。
      • 私人:第(更新)

在我進入工作,我將不勝感激一些反饋。也許還有其他更好的方法來處理資源之間的關係?

回答

1

這樣做會違反REST服務是冪等的原則。這意味着您應該能夠發送相同的操作兩次而不用第二個操作更改資源。

我把這個關係作爲一個單獨的資源: 創建/更新將是PUT ../api/users/{userId}/dogs/{dogId}與私人:是/否。刪除關係將由DELETE ../api/users/{userId}/dogs/{dogId}處理。

+0

好的,我一直在想單獨的資源。但是,你如何要求一個用戶的所有關係? –

+0

@Mattias:'GET/api/users/{userId}/dogs/[dogId /]'?如果未指定'dogId',則將所有關係都設置爲'userId'。 –

+0

對我來說,「GET/api/users/{userId}/dogs」實際上會給我所有與{userId}有關係的狗對象(不是關係)。否則,如果我想查看用戶的所有狗對象,我將不得不先查詢關係,然後單獨查詢每個狗對象(.../api/dogs/{dogId})。這對我來說似乎很複雜...... –