Ada*_*itt 5 c# asp.net rest asp.net-mvc-routing asp.net-web-api
我有以下休息架构,我想使用ASP.NET Web Api实现:
http://mydomain/api/students
http://mydomain/api/students/s123
http://mydomain/api/students/s123/classes
http://mydomain/api/students/s123/classes/c456
Run Code Online (Sandbox Code Playgroud)
我使用ApiController和以下两种方法使前两个链接正常工作:
public class StudentsController : ApiController {
// GET api/students
public IEnumerable<Student> GetStudents() {
}
// GET api/students/5
public IEnumerable<Student> GetStudent(string id) {
}
}
Run Code Online (Sandbox Code Playgroud)
在同一个控制器中,(或者我需要一个名为ClassesController的不同控制器吗?),我该如何实现最后两个链接?另外,"类"部分的路由是什么样的(如果需要)?
这是我的WebApiConfig(我想保持动态,而不是硬编码到/ classes的路径,如果可能的话:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
// EDIT - I'm getting 404's when trying to use this
context.Routes.MapHttpRoute(
name: "JobsApi",
routeTemplate: this.AreaName + "/Students/{id}/Classes/{classId}",
defaults: new { classId = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
编辑这是我新创建的ClassesController:
public class ClassesController : ApiController {
// GET api/classes
public IEnumerable<TheClass> Get(string id) {
return null;
}
}
Run Code Online (Sandbox Code Playgroud)
尝试转到此URL时,我收到404错误:
http://mydomain/api/students/s123/classes
Run Code Online (Sandbox Code Playgroud)
ASP.NET中的路由可以表达这些更复杂的规则,但需要明确设置.例如,在这种情况下,您必须定义2个路由:
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/students/{studentId}/{controller}/{classId}",
defaults: new { classId = RouteParameter.Optional }
);
Run Code Online (Sandbox Code Playgroud)
你会有一个控制器:
public class ClassesController
{
public TheClass Get(int studentId, int classId)
{
....
}
}
Run Code Online (Sandbox Code Playgroud)
这可能并不理想,但主要选择.
我正在进行分层路由,由于Web API中的实现问题,这是不可能的,但是这个问题现在已经修复,所以我可能会再次开始研究它.
通过这种优秀的分层方法,您可以更多地关注内部路由.有一个很好的示例应用程序采用分层资源结构:PingYourPackage.检查出.
注意:我有一篇关于此问题的博客文章解释了下面的问题,并为那些包含一些代码示例的人提供了解决方案.您可以查看更多详细信息:
让我通过设置一个示例场景简要解释一下这里的问题.对于这些类型的情况,这可能不是理想的方法,但很好地解决了这些问题.假设您的数据库中有以下两个附属公司,用于装运公司:
然后假设这些附属公司附加了一些货物:
最后,我们希望拥有以下资源结构:
GET api/affiliates/{key}/shipments
GET api/affiliates/{key}/shipments/{shipmentKey}
POST api/affiliates/{key}/shipments
PUT api/affiliates/{key}/shipments/{shipmentKey}
DELETE api/affiliates/{key}/shipments/{shipmentKey}
Run Code Online (Sandbox Code Playgroud)
@Ali已经解释过了,但我在这里采用了不同的方法.假设我们正在发送GET请求/api/affiliates/105/shipments/102.请注意,此处的联盟密钥为105,但不存在.所以,我们希望尽快终止请求.我们可以使用per-route消息处理程序实现此目的.
如果您有某种类型的身份验证,您可能希望确保(在我们的场景中)经过身份验证的用户和请求的联盟资源相关.例如,假设Affiliate1在Affiliate角色下进行身份验证,并且您已AuthorizeAttribute注册以检查"Affiliate"角色授权.在这种情况下,你将失败,因为这意味着Affiliate1可以获得以下资源:/api/affiliates/101/shipments属于Affiliate2.我们可以通过自定义消除此问题AuthorizeAttribute.
现在,以下URI应该为我提供正确的数据:
GET/api/affiliates/100 /货运/ 102
但是,下面的URI会发生什么:
GET/api/affiliates/100 /货运/ 103
这应该为您提供"404 Not Found"HTTP响应,因为其ID为100的联盟会员不拥有ID为103的货件.
| 归档时间: |
|
| 查看次数: |
6334 次 |
| 最近记录: |