【发布时间】:2013-07-08 14:02:30
【问题描述】:
我很难让 API 帮助页面显示我的所有 API 端点,并以我想要的样式显示它们。
这是我的路线:
config.Routes.MapHttpRoute("Orgs", "v1/Orgs/{orgId}",
new { controller = "Orgs", orgId = RouteParameter.Optional });
config.Routes.MapHttpRoute("OrgDescendants", "v1/Orgs/{orgId}/Descendants",
new { controller = "Orgs", action = "OrgDescendants" });
这是我所有的控制器方法:
[HttpGet]
public IEnumerable<Org> GetAllOrgs()
[HttpGet]
public Org Get(string orgId)
[HttpGet]
[ActionName("OrgDescendants")]
public List<Org> Descendants(string orgId)
[HttpPost]
public HttpResponseMessage Post(Org org)
[HttpPut]
public HttpResponseMessage Put(string orgId, Org org)
[HttpDelete]
public void Delete(string orgId)
这里是帮助页面显示的端点:
GET v1/Orgs
POST v1/Orgs
PUT v1/Orgs/{orgId}
DELETE v1/Orgs/{orgId}
GET v1/Orgs/{orgId}/Descendants
如您所见,帮助页面缺少以下端点:
GET v1/Orgs/{orgId}
我已经尝试了很多不同的路由排列,但我迷失了方向。无论我尝试什么,我总是会丢失一些端点或格式“不正确”。
例如,我最终得到:
GET v1/Orgs/{orgId}/Get
当我想要的时候:
GET v1/Orgs/{orgId}
或者我最终得到:
PUT v1/Orgs?orgId={orgId}
当我想要的时候:
PUT v1/Orgs/{orgId}
无论我尝试哪种组合,我似乎都无法按照我想要的方式得到它们。任何帮助将不胜感激!
【问题讨论】:
-
我猜HelpPage认为路由
GET v1/Orgs/{orgId}在Get(string orgId)和Descendants(string orgId)之间存在冲突。实际上,您可能会尝试向GET v1/Orgs/{orgId}发出请求,并且应该会看到一个错误,例如“找到多个操作...”等。 -
当我像这样定义嵌套路由时,我通常将嵌套资源设置为不同的控制器,在您的情况下它将是
DescendantsController。这样,如果需要,您也可以在后代上拥有完整的休息 API。也许这是您可以探索的解决方法... -
我一直在考虑将后代移动到他们自己的控制器中,但由于它们也是组织,我希望将它们保留在同一个控制器中以节省重复代码。看起来这可能是目前最好的解决方法。我会试一试,看看它是否有效。
标签: c# .net asp.net-mvc asp.net-web-api asp.net-web-api-routing