如何将多个args传递/接收到RESTful Web API GET方法?

接收参数(返回标量值而不是数据集)的GET RESTful方法的常见示例如下所示:

public string Get(int id) { //get and return the value } 

…传递的val通常是一个ID,因此您可以使用它来获取基于该唯一值的标量值。

但是,如果要传递多个值,例如字符串和int,该怎么办? 这只是定义一个这样的方法的问题:

 public string Get(string someString, int someInt) { //get and return the value } 

……并且这样称呼它:

 //const string uri = "http://192.112.183.42:80/api/platypusItems/someString/someInt";, zB: const string uri = "http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42"; var webRequest = (HttpWebRequest) WebRequest.Create(uri); 

IOW,路由机制是否会发现,由于传递了两个args,它应该使用两个args(“约定优于配置”)调用Get()方法,还是需要做更多的事情才能正确地路由事物?

如果您使用Web API 2,那么您可以使用属性路由来路由请求,例如http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42

 public class ItemsController : ApiController { [Route("api/{controller}/{id}")] public string GetItemById(int id) { // Find item here ... return item.ToString(); } [Route("api/{controller}/{name}/{id}")] public string GetItemByNameAndId(string name, int id) { // Find item here ... return item.ToString(); } } 

http://192.112.183.42:80/api/platypusItems/DuckbilledPlatypisAreGuysToo/42将映射到GetItemByNameAndIdhttp://192.112.183.42:80/api/platypusItems/42将映射到GetItemById

请注意,您需要在配置中启用属性路由,如下所示:

 public static class WebApiConfig { public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); } } 

但通常你应该将参数作为附加参数传递。 使用GET请求尤其容易。 这将在Web API 1和2中起作用:

 public class ItemsController : ApiController { public string GetItemById(int id) { // Find item here ... return item.ToString(); } public string GetItemByNameAndId(string name, int id) { // Find item here ... return item.ToString(); } } 

假设您有默认的映射配置, http://192.112.183.42:80/api/platypusItems/42 GetItemById将映射到GetItemByIdhttp://192.112.183.42:80/api/platypusItems/42?name=DuckbilledPlatypisAreGuysToo将是映射到GetItemByNameAndId因为Web API可以为GetItemById映射2个参数而不是1。

有关Web API中 属性路由 , 路由和操作选择和路由的 Mike Wasson文章中可以找到更多信息。