[英]ASP.NET Web API Routing with PUT
我正在尝试设置Web API路由,我认为这将是一件非常简单的事情。 但是,似乎Web API中的路由与不同的HTTP谓词不一致。 假设这个控制器有这些动作......
public class AvalancheController : ApiControllerBase
{
// GET api/avalanche
public IEnumerable<Avalanche> Get() {}
// GET api/avalanche/5
public Avalanche Get(int id) {}
// GET api/avalanche/ActionTest/5
[ActionName("ActionTest")]
public Avalanche GetActionTest(int id) {}
// GET api/avalanche/ActionTest/2
[ActionName("ActionTest2")]
public Avalanche GetActionTest2(int id) {}
// POST api/avalanche
public void Post([FromBody]Avalanche value) {}
// PUT api/avalanche/5
public void Put(int id, [FromBody]Avalanche value) {}
// PUT api/avalanche/test/5
[ActionName("Test")]
public void PutTest(int id, [FromBody]Avalanche value) {}
// DELETE api/avalanche/5
public void Delete(int id) {}
}
我定义了以下路线......
config.Routes.MapHttpRoute(
name: "ActionRoutes",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional },
constraints: new
{
controller = "Avalanche",
action = "(ActionTest|ActionTest2|Test)"
}
);
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
然后我最终定义了以下路线......
GET api/Avalanche/ActionTest/{id}
GET api/Avalanche/ActionTest2/{id}
PUT api/Avalanche/Test/{id}
GET api/Avalanche
POST api/Avalanche
DELETE api/Avalanche/{id}
为什么默认的PUT路由没有被选中? 默认GET的路由和默认PUT之间有什么不同? 我试过以各种可想象的方式装饰功能,但我得到了相同的结果。
主要是我想知道如何获取默认的PUT路由。 如果您对如何修改这些路由有任何建议,那么我不必为每个控制器指定一个路径来指定行动名称。
谢谢!
伊恩
编辑:今天早上我注意到以下路线也没有被定义..
GET api/Avalanche/{id}
很高兴你找到了解决问题的方法。 但我会根据我对REST服务的学习提供反馈。 REST webservice的想法是将每个URL解析为资源(或者可能是实体),并且根据HttpVerb,确定操作。 在这种情况下,您有三个GET操作,可以在修改时正常工作。
但我认为控制器也可以重新安排,以便进行单一的GET操作并具有单一责任,从而提高可维护性。 例如:
AvalancheController
public class AvalancheController : ApiControllerBase
{
public IEnumerable<Avalanche> GET()
{
}
public void POST(Avalanche avalanche)
{
}
}
可以假设处理顶层的所有雪崩,下面是要定义的操作。
GET:返回所有雪崩
POST:插入新的雪崩
PUT:没用过
删除:未使用
AvalancheDetailsController
public class AvalancheDetailsController : ApiControllerBase
{
public Avalanche GET(int id)
{
}
public int PUT(int id)
{
}
public int DELETE(int id)
{
}
}
可以假设处理单个雪崩,下面是要定义的操作。
GET:返回单雪崩
POST:没用过
PUT:更新单次雪崩
删除:删除单个雪崩
现在我假设我们对控制器之间有明确的区别。 在您提到的OP中,可以有不同的GET操作,但它只返回单个Avalanche
。 所以,我会改变GET方法将对象作为输入并检查值,即
public class AvalanceRequest
{
public int? Id {get;set;}
public string Name {get;set;}
}
public class AvalancheDetailsController : ApiControllerBase
{
public Avalanche GET(AvalanceRequest request)
{
//write business logic based on parameters
if(request.Id.HasValue)
//return avalanche;
if(request.Name.IsNullOrEmpty())
//return avalanche
}
//other methods
}
处理URL时,我并没有真正使用WebAPI,而是尝试使用ServiceStack来开发REST服务。 它允许附加url独立于控制器名称。
网址
api / Avalanche - > AvalancheController(基于HttpVerb调用操作)
api / Avalanche / Id - > AvalancheDetailsController(基于HttpVerb调用操作)
我不知道url是否可以在WebAPI中同样附加,否则你最终会有默认配置并通过调用。 api / Avalanche和api / AvalancheDetails / id。
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
我很抱歉很长的帖子,希望它有道理。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.