我正在尝试编写API。签名如下所示:
public class CardsController : ApiController
{
[HttpGet]
public ClientData NewGame(){...}
[HttpGet]
public ClientData Deal(int sessionId){...}
[HttpGet]
public ClientData Stand(int sessionId){...}
}
其他一切都是默认的,我收到一个错误,说我的班级无法区分交易和支持。经过一番研究后,我发现这是一个路由问题。所以我决定更新我的路由。
我的global.asax.cs现在看起来像这样:
public class MvcApplication : HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
WebApiConfig.Register(GlobalConfiguration.Configuration);
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
AuthConfig.RegisterAuth();
RegisterRoutes(RouteTable.Routes);
}
public static void RegisterRoutes(RouteCollection routes)
{
routes.MapHttpRoute("api", "api/{controller}/{action}/{value}", new { value = RouteParameter.Optional});
}
}
转到http://localhost:54924/api/Cards/Stand/19
会出现错误消息,指出未找到HttpResource,并转到http://localhost:54924/api/Cards/Stand
会触发NewGame()
操作。如何让Stand和Deal在同一个控制器上工作?
答案 0 :(得分:3)
Web API与RESTful路由一起使用。在REST中,您可以使用它们进行资源和标准操作:GET,POST,PUT,PATCH和DELETE。这就是你的行为应该被命名的方式。 Deal
和Stand
表示在RESTful
路由中绝对注意到。在设计API时,您应该考虑资源和可以使用这些资源执行的标准HTTP谓词。在RESTful API中,控制器代表您的资源,HTTP谓词是您要对此资源执行的操作。
如果您要违反Web Api路由中内置的默认RESTful约定,则必须修改路由设置并在其中包含{action}
名称。然后,您可以根据需要为自己的行为命名。请记住,如果您正在设计API,则会有消费者遵守的标准。如果你想重新发明轮子,请确保你有非常好的API文档。
答案 1 :(得分:1)
添加路线:
routes.MapHttpRoute("DealApi",
"api/{controller}/deal/{sessionId}",
new { action="Deal", sessionId = RouteParameter.Optional });
routes.MapHttpRoute("StandApi",
"api/{controller}/stand/{sessionId}",
new { action="Stand", sessionId = RouteParameter.Optional });
现在,在您的Controller类中:
[HttpGet]
[ActionName("Deal")]
public ClientData Deal(int sessionId){...}
[HttpGet]
[ActionName("Stand")]
public ClientData Stand(int sessionId){...}
现在,无论何时拉出网址http://www.yourhost.com/api/deal/12345,都会调用Deal函数。与Stand相同。
请记住,您在路线表中设置的任何内容仅用于识别网址是否有效。通过在第三个参数中指定操作,您将告诉Web Api找到一个ActionName属性设置为您指定的函数。
另一件事 - 将这两条路线放在任何默认的api路线之前。