Web Api 接受字符串、整数、字母数字的方法
Web Api Method accepting string, int, alphanumeric
我正在研究一些 Web Api 方法,并且 运行 进入我们传递三种不同类型参数的场景:数字、字符串和字母数字值。
这是我的路由信息:
string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
string numeric = @"^\d+$";
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { action = alphanumeric }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionId",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { action = alphanumeric, id = numeric }
);
有了这条路线信息,我可以得到字符串和字母数字值,但不能得到数字(通过相同的方法)。这是我的代码:
public IEnumerable<Deliveries> GetByAdvanced(string name)
{
var deliveries = ...
return deliveries;
}
例如示例网站 API 网址
- 作品http://localhost:64288/Api/Deliveries/GetByAdvanced/Hello
- 作品http://localhost:64288/Api/Deliveries/GetByAdvanced/ab12345
- 失败http://localhost:64288/Api/Deliveries/GetByAdvanced/12345
现在,如果我添加另一种方法来处理 int 值,它就可以正常工作。例如下面的代码
public IEnumerable<Deliveries> GetByAdvanced(int id)
{
var deliveries = ...
return deliveries;
}
这是接受这些值的正确方法吗?
如果它只会影响一种方法,那么您可以在控制器中尝试 Attribute Routing 而不是修改路由配置。
试试下面的方法
[Route("Api/Deliveries/{id}/{StringVal}/{AlphaVal}")]
public IEnumerable<Deliveries> GetByAdvanced(int id, string StringVal, string AlphaVal)
{
var deliveries = ...
return deliveries;
}
查看您的示例 Web API 网址,它们都应该有效。
我使用以下配置创建了两个简单的新 Web 项目:
1) MVC4、Web Api 和 .NET 4
2) MVC 5、Web Api 2.2 和 .NET 4.5.1
我在控制器中使用了与您介绍的相同的路由和相同的操作方法,所有示例执行工作正常。您的整个网络 api 配置文件看起来如何?您是否在操作方法或控制器上定义了一些额外的路由但没有向我们展示?
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
config.MapHttpAttributeRoutes();
string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
string numeric = @"^\d+$";
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { action = alphanumeric }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionId",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { action = alphanumeric, id = numeric }
);
}
}
控制器:
public class DeliveryController : ApiController
{
public string GetByAdvanced(string name)
{
return name;
}
}
顺便提一句。为什么要为操作名称指定约束条件?
我正在研究一些 Web Api 方法,并且 运行 进入我们传递三种不同类型参数的场景:数字、字符串和字母数字值。
这是我的路由信息:
string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$";
string numeric = @"^\d+$";
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionName",
routeTemplate: "api/{controller}/{action}/{name}",
defaults: null,
constraints: new { action = alphanumeric }
);
config.Routes.MapHttpRoute(
name: "DefaultApiControllerActionId",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: null,
constraints: new { action = alphanumeric, id = numeric }
);
有了这条路线信息,我可以得到字符串和字母数字值,但不能得到数字(通过相同的方法)。这是我的代码:
public IEnumerable<Deliveries> GetByAdvanced(string name)
{
var deliveries = ...
return deliveries;
}
例如示例网站 API 网址
- 作品http://localhost:64288/Api/Deliveries/GetByAdvanced/Hello
- 作品http://localhost:64288/Api/Deliveries/GetByAdvanced/ab12345
- 失败http://localhost:64288/Api/Deliveries/GetByAdvanced/12345
现在,如果我添加另一种方法来处理 int 值,它就可以正常工作。例如下面的代码
public IEnumerable<Deliveries> GetByAdvanced(int id)
{
var deliveries = ...
return deliveries;
}
这是接受这些值的正确方法吗?
如果它只会影响一种方法,那么您可以在控制器中尝试 Attribute Routing 而不是修改路由配置。
试试下面的方法
[Route("Api/Deliveries/{id}/{StringVal}/{AlphaVal}")]
public IEnumerable<Deliveries> GetByAdvanced(int id, string StringVal, string AlphaVal)
{
var deliveries = ...
return deliveries;
}
查看您的示例 Web API 网址,它们都应该有效。
我使用以下配置创建了两个简单的新 Web 项目:
1) MVC4、Web Api 和 .NET 4
2) MVC 5、Web Api 2.2 和 .NET 4.5.1
我在控制器中使用了与您介绍的相同的路由和相同的操作方法,所有示例执行工作正常。您的整个网络 api 配置文件看起来如何?您是否在操作方法或控制器上定义了一些额外的路由但没有向我们展示?
public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); string alphanumeric = @"^[a-zA-Z]+[a-zA-Z0-9,_ -]*$"; string numeric = @"^\d+$"; config.Routes.MapHttpRoute( name: "DefaultApiControllerActionName", routeTemplate: "api/{controller}/{action}/{name}", defaults: null, constraints: new { action = alphanumeric } ); config.Routes.MapHttpRoute( name: "DefaultApiControllerActionId", routeTemplate: "api/{controller}/{action}/{id}", defaults: null, constraints: new { action = alphanumeric, id = numeric } ); } }
控制器:
public class DeliveryController : ApiController { public string GetByAdvanced(string name) { return name; } }
顺便提一句。为什么要为操作名称指定约束条件?