我正在开发我的第一个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,并加入我的移动应用品牌缓存中的价值?
走哪条路?
非常感谢!
答案 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 无状态。每个请求/响应都应该是完整且自包含的,并且应该包含足够的数据以完成整个读取,更新或删除操作。