实体的联合值的REST更新:按键还是按值执行?

时间:2011-11-25 22:51:53

标签: rest

我正在开发我的第一个REST API,并且有一个设计问题。

  

我想在本机Android移动应用程序中使用此api

假设我有一张Car表和一张Brand表,如下所示:

Car( car_id, name, brand_id );
Brand( brand_id, name );

我如何在Rest api更新和读取中代表Car和Brand的联合?

使用-情况:

1)用户读取他的汽车:在回复中,发送品牌名称就足够了,我们不关心品牌ID ,它对用户有意义

2)用户想要更新汽车数据:我们必须首先执行 1),以检索汽车的当前详细信息,然后向用户表示选择列表以从品牌中选择。< / p>

问题

我应该为我的Car实体代表两种读取:一种是带有品牌ID的更新,另一种是带有品牌名称的读取?

或者我应该反复询问联合表:品牌;缓存它;那么在我的汽车阅读方法中,只会展示品牌ID,并加入我的移动应用品牌缓存中的价值?

走哪条路?

非常感谢!

1 个答案:

答案 0 :(得分:1)

在设计API时,不要过多考虑数据库架构和连接。相反,请考虑如何以RESTful方式通过HTTP建模和访问您的资源。

用例1应由Car URI(例如https://your.api/car/787)上的GET提供。这应该返回响应正文中的单个Car的所有相关详细信息(这是您的Car资源的“表示”)。例如,JSON响应正文可能是这样的:

{
  "id" : "123",
  "name" : "Ford Mustang",
  "brand" : "https://your.api/brand/53"
}

如果API客户端需要有关品牌的详细信息,他们可以获取URI https://your.api/brand/53以获取有关该品牌的所有JSON详细信息。

对于用例2,应该通过让客户端将Car的新表示PUT设置为与上面相同的Car URI(https://your.api/car/787)来完成。如果他们希望更改品牌,他们需要在调用PUT之前获得新的品牌URI,以便在更新请求中传递它。他们可以通过在https://your.api/brands等集合URI上调用GET,然后在请求正文中传递所需的品牌URI来获取完整的品牌列表。

请注意,设计合理的RESTful API 无状态。每个请求/响应都应该是完整且自包含的,并且应该包含足够的数据以完成整个读取,更新或删除操作。