我正在尝试找到具有多个get方法的apicontroller的路由配置。
控制器类有3种方法:
Public Function GetAllProducts() As IEnumerable(Of Product)
Public Function GetProductById(prodid As Integer) As Product
Public Function GetProductByCategory(categoryName As String) As Product
请建议所有3种方法所需的路由配置。
答案 0 :(得分:2)
我们通常遵循Web API Design Guidelines from apigee,它们是世界上几个成功的Web API中使用的模式集合。
该指南建议下面的图表来组织您的web api资源,理想情况是按资源保留2个基本网址:
在您的具体情况下,您的资源是“产品”,因此我建议您使用以下网址:
您的web api表路由可以非常简单地配置,例如:
routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new
{
id = RouteParameter.Optional,
action = RouteParameter.Optional
});
答案 1 :(得分:2)
我认为某个类别可能会返回多个产品。
在VB中使用可选参数,如:
Public Function GetProducts(Optional category As String = "") As IEnumerable(Of Product)
Public Function GetProduct(ByVal id as Integer) As Product
或C#
public IEnumerable<Product> GetProducts(string category = "")
public Product GetProduct(int id)
使用以下网址:
/api/product
/api/product/1
/api/product?category=myCategory
保留默认路线。
答案 2 :(得分:1)
最后我有解决方案。我正在寻找可以根据参数类型调用方法的路由配置。
config.Routes.MapHttpRoute( _
name:="apiById", _
routeTemplate:="api/{controller}/{prodid}", _
defaults:=New With {.controller = "Products"}, constraints:=New With {.prodid
= "^\d+$"})
config.Routes.MapHttpRoute( _
name:="apiByname", _
routeTemplate:="api/{controller}/{categoryName}", _
defaults:=New With {.controller = "Products"})
config.Routes.MapHttpRoute( _
name:="apiByAction", _
routeTemplate:="api/Products", _
defaults:=New With {.controller = "Products"})
缺少的链接在第一条路线上使用约束,指定它仅接受数字值。例如API /产品/ 1 第二个配置处理剩余的请求,例如在类别名称的URL中指定的字符串值,例如api / products / books 第三个配置路由到没有参数的所有请求操作方法
使用正确的参数名称routetemplate也很重要,比如prodid,categoryname。名称应与相应的操作方法中声明的名称相同。