Asp.Net Web Api多个get方法

时间:2013-05-09 14:44:29

标签: asp.net asp.net-web-api

我正在尝试找到具有多个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种方法所需的路由配置。

3 个答案:

答案 0 :(得分:2)

我们通常遵循Web API Design Guidelines from apigee,它们是世界上几个成功的Web API中使用的模式集合。

该指南建议下面的图表来组织您的web api资源,理想情况是按资源保留2个基本网址:

enter image description here

在您的具体情况下,您的资源是“产品”,因此我建议您使用以下网址:

  • / products
  • /产品/ {ID}
  • /产品?cagetoryName = {}类别名称

您的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。名称应与相应的操作方法中声明的名称相同。