如何最好地重载RESTful服务方法?

如何最好地重载RESTful服务方法?,rest,asp.net-web-api,Rest,Asp.net Web Api,我有一个使用ASP.NETMVC模板构建的RESTfulWebAPI。它工作得很好。我不确定如何优雅地安排两个参数冲突的方法。我有一个证书表,其中列出了我的Microsoft证书。我有一个考试表,列出了每个认证的考试。有一对多的关系。当我创建ExamController时,它自动添加了一个GetTests方法和一个GetTest id方法。GetExams方法返回所有的考试记录,GetExams方法返回与id匹配的考试记录。到目前为止还不错。我想添加一个getExamInstant certif

我有一个使用ASP.NETMVC模板构建的RESTfulWebAPI。它工作得很好。我不确定如何优雅地安排两个参数冲突的方法。我有一个证书表,其中列出了我的Microsoft证书。我有一个考试表,列出了每个认证的考试。有一对多的关系。当我创建ExamController时,它自动添加了一个GetTests方法和一个GetTest id方法。GetExams方法返回所有的考试记录,GetExams方法返回与id匹配的考试记录。到目前为止还不错。我想添加一个getExamInstant certificationId方法来返回与指定证书相关的所有考试。那是火车离开铁轨的时候。它抛出了一个错误,即存在冲突的方法,这对我来说没有意义,因为一个名为GetExam,带有int参数,另一个名为GetExams,带有int参数。我认为微软在未来发布的Web API中有一些设计问题需要改进。因此,我将第二个方法重新编写为GetExamsint id,intextra,并忽略额外的int参数。这很有效,但并不优雅,我是一个优雅的人。组织这三种方法的最佳RESTful方式是什么?

修复URL并使用属性路由

[HttpGet]
[Route("api/exams/{id}")]
public IHttpActionResult GetExams(int id) { }

[HttpGet]
[Route("api/certifications/{cid}/exams")]
public IHttpActionResult GetCertificationExams(int cid) { }

修复URL并使用属性路由

[HttpGet]
[Route("api/exams/{id}")]
public IHttpActionResult GetExams(int id) { }

[HttpGet]
[Route("api/certifications/{cid}/exams")]
public IHttpActionResult GetCertificationExams(int cid) { }

获取这两个资源的URL是什么?获取一个考试:,获取CertificationID 3的所有考试:创建一个新操作IHttpActionResult GetExamByCertificationIt CertificationID,并将其映射到api/Certifications/{CertificationID:int}/ExamsNkosi这样的路由,这是一个我猜不到的结构,但它是有意义的。这是RESTful的标准方式还是您的方式?我是RESTful服务的新手。Nkosi-我试图按照您的建议编写代码,但它给了我HTTP错误404.0-找不到。是否需要在WebApiConfig.cs中添加路由路径?那会是什么样子?我还尝试了在线找到的另一个建议,添加类似于public IQueryable GetExams[FromODataUri]int key的内容,并使用api/Certifications3/Exams调用它,但失败了,因为没有找到与请求URI匹配的HTTP资源。有人能提出解决方案吗?获取这两个资源的URL是什么?获取一个考试:,获取CertificationID 3的所有考试:创建一个新操作IHttpActionResult GetExamByCertificationInt CertificationID,并将其映射到api/Certifications/{CertificationID:int}/ExamsNkosi这样的路由,这是一个我猜不到的结构,但这是有道理的。这是RESTful的标准方式还是您的方式?我是RESTful服务的新手。Nkosi-我试图按照您的建议编写代码,但它给了我HTTP错误404.0-找不到。是否需要在WebApiConfig.cs中添加路由路径?那会是什么样子?我还尝试了在线找到的另一个建议,添加类似于public IQueryable GetExams[FromODataUri]int key的内容,并使用api/Certifications3/Exams调用它,但失败了,因为没有找到与请求URI匹配的HTTP资源。有人能提出解决方案吗?Jasen-这很有效。非常感谢你。我有几个小时没有尝试,因为我认为它不会工作,但我还不太了解WebAPI。我已经阅读了一些MSDN和其他关于Web API路由的解释,但还没有找到一个清晰、简洁的解释。有你喜欢的吗?我想认证结束时需要一个s。这是查询相关实体的普通RESTful解决方案吗?也就是说,使用属性路由?任何解释性链接都将不胜感激。下面是一些关于属性路由的基础知识。属性路由很好,因为我可以立即看到哪个URL将与我的操作匹配,并使您从约定规则中解放出来,以命名您认为最有意义的操作。Jasen-这很有效。非常感谢你。我有几个小时没有尝试,因为我认为它不会工作,但我还不太了解WebAPI。我已经阅读了一些MSDN和其他关于Web API路由的解释,但还没有找到一个清晰、简洁的解释。有你喜欢的吗?我想认证结束时需要一个s。这是查询相关实体的普通RESTful解决方案吗?也就是说,使用属性路由?任何解释性链接都将不胜感激。下面是一些关于属性路由的基础知识。属性路由很好,因为我可以立即看到哪个URL将与我的操作匹配,并将您从约定规则中解放出来,为您的操作命名最有意义的名称。