将 API 从类似 REST 的路由转换为命名参数

Converting API from REST-like routing to named parameters

我创建了一个 API 来查找参数...

http://server/api/contollerName/param1/param2/param3

对于此模式,我使用了以下方法属性:

[Route("api/myController/{param1}/{param2}/{param3}")]
[HttpGet]
public IHttpActionResult myMethod(int param1, int param2, int param3)
{
  // Method implementation goes here
}

然而,使用 API 的人(UI 开发人员)更愿意将 API 设置为这样...

http://server/api/controllerName?param1=value&param2=value&param3=value

我认为我需要做的就是删除我的方法的属性,Web Api 路由引擎将根据参数名称选择正确的方法,这样的想法是否正确?有没有办法像我最初所做的那样修改路由以显式定义方法和参数?我喜欢指定路线,这样就不会对将要执行的方法产生歧义。

您认为您需要做的就是删除方法的属性,这是正确的。您将无法定义格式为

的路由模板

http://server/api/controllerName?param1=value&param2=value&param3=value

因为ASP.NetWeb API2路由模板不允许包含“?”路由模板中的字符。您最接近的是

http://server/api/controllerName/MethodName/param1={param1},param2={param2}

另请注意,如果您在路由模板中有 &,ASP.NET 将抛出一个错误,指出检测到危险的 Request.Path 值,当您发出请求命中那个 API 时.这可以通过参考这个 SO Question

来解决