【发布时间】:2013-11-18 20:55:28
【问题描述】:
由于后端设计的限制,我们的 API 需要如何运行经过长时间的讨论,我希望有以下可能性:
1. /students/251/employment <--- allow GET, PUT, POST
2. /students/251/employment/jobs <--- allow GET only
3. /students/251/employment/jobs/435 <--- allow all verbs
4. /students/251/employment/internships <--- allow GET only
5. /students/251/employment/internships/664 <--- allow all verbs
这些情况适用于 GET 请求。当我尝试对案例 #1 和 #3 执行 PUT 请求时,我正在苦苦挣扎:
Case #1 Error
No HTTP resource was found that matches the request URI '/students/251/employment/221'.,
No action was found on the controller 'Employment' that matches the name '221'.
Case #3 Error
The requested resource does not support http method 'PUT'.
以下是我的控制器方法的精简版:
public ApiEmploymentGetResult Get(long id) {
// code omitted
}
[HttpGet]
public IEnumerable<ApiJob> Jobs(long id) {
// code omitted
}
[HttpGet]
public IEnumerable<ApiOwnVenture> OwnVenture(long id) {
// code omitted
}
public void Put(long id, MyModel model) {
// breaks before getting here
}
我的路由看起来像这样,但我不确定它是否完全正确,即使 GET 正在工作。
context.Routes.MapHttpRoute(
name: "V1/EmploymentApi",
routeTemplate: "api/v1/Employment/{action}/{jobId}",
defaults: new { controller = "Employment", jobId = RouteParameter.Optional, action = "Get" }
);
案例 #1 似乎是冲突的,因为框架期望采取行动而不是 221。我希望能够使所有这些案例都能正常工作。
【问题讨论】:
-
如果你的路由是 'api/v1/Employment/{action}/{jobId}' 它到底如何匹配'/students/251/employment/jobs'之类的东西?
标签: asp.net-web-api asp.net-mvc-routing asp.net-routing