C# RESTAPI-控制器中多个GetByX的最佳实践

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

所以这应该是一个相当简单的问题。事实上,我已经阅读了很多关于更复杂的Restful设计问题的问答,我没有找到这个简单问题的答案。。。因此,如果我有以下实体:

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 by
Person-Id
实现,而不需要Get by
Guest-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搜索客人的另一种方法。虽然您的示例适用于通过各自的主键返回客人或个人,但它不适用于我的要求。还有什么想法吗?我更新了答案,这就是你想要的吗?