C# RESTAPI-控制器中多个GetByX的最佳实践
所以这应该是一个相当简单的问题。事实上,我已经阅读了很多关于更复杂的Restful设计问题的问答,我没有找到这个简单问题的答案。。。因此,如果我有以下实体:C# RESTAPI-控制器中多个GetByX的最佳实践,c#,rest,asp.net-web-api,restful-url,restful-architecture,C#,Rest,Asp.net Web Api,Restful Url,Restful Architecture,所以这应该是一个相当简单的问题。事实上,我已经阅读了很多关于更复杂的Restful设计问题的问答,我没有找到这个简单问题的答案。。。因此,如果我有以下实体: public class Guest { public int GuestId { get; set; } public int PersonId { get; set; } // bunch of other properties } 如果我想通过GuestId或PersonId获取Guest对象的方法,我的Gues
public class Guest
{
public int GuestId { get; set; }
public int PersonId { get; set; }
// bunch of other properties
}
如果我想通过GuestId
或PersonId
获取Guest
对象的方法,我的GuestController
应该是什么样子
我知道我可以通过这样的方式来完成
public class GuestsController
{
// GET api/guests/1
public Guest Get(int id)
{
// get the Guest by GuestId
}
// GET api/guests/GetbyPersonId/2
public Guest GetbyPersonId(int personId)
{
// get the Guest by PersonId
}
}
。。。然后使用属性路由或操作或其他方法来访问GetByPersonId
方法,但这似乎并不符合我所阅读的整个Restful设计原则。在这种情况下有什么建议?我编辑了我的答案,
我建议您使用更好的逻辑层次url来映射您的实现。
所以我将url结构改为下面的
// /api/people/{Id}/
public class PersonRequest
{
public int PersonId {get; set;}
}
// /api/people/{Id}/guest
public class GuestRequest : PersonRequest
{
}
在使用了更好的分层url结构之后,我认为更清楚的是,您只提供了Get byPerson-Id
实现,而不需要Get byGuest-Id
public class PersonService
{
public object Get(PersonRequest request)
{
return GuestController.Get(request.PersonId);
}
public object Get(GuestRequest request)
{
return GuestController.Get(request.PersonId);
}
}
我可能建议将
/people/{personId}/guest
映射到GetGuestByPersonId
,假设guest
是person
的一对一关系。我编辑了我的帖子,因为我有一个错误,可能会给您留下错误的印象,我希望这两种方法都返回一个guest对象。因此,基本上,它将类似于通过GuestId搜索客人,以及通过PersonId搜索客人的另一种方法。虽然您的示例适用于通过各自的主键返回客人或个人,但它不适用于我的要求。还有什么想法吗?我更新了答案,这就是你想要的吗?