API控制器声明超过一个Get语句(Api controller declaring more th

2019-06-23 14:00发布

使用在MVC4新的API控制,我发现一个问题。 如果我有以下几种方法:

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

这将工作。 但是,如果我想要检索不同类型的一些不同的数据,则默认为GetAll方法,即使$.getJSON设置为GetAllIntegers方法:

public IEnumberable<int> GetAllIntergers()

(坏的命名约定)

是否有可能对我来说,能做到这一点?

我只能有一个GetAll在Web API控制器的方法?

我认为这是比较容易想象我想要实现的。 下面是一个代码片段,显示想我是能够做到的,在一个单一的ApiController

public IEnumerable<string> GetClients()
{ // Get data
}

public IEnumerable<string> GetClient(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMember(int id)
{ // Get data
}

public IEnumerable<string> GetStaffMembers()
{ // Get data
}

Answer 1:

这是所有的路由。 默认的Web API的路线是这样的:

config.Routes.MapHttpRoute( 
    name: "API Default", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
);

使用默认路由模板,网页API使用HTTP方法来选择操作。 在结果它将映射不带参数的第一个GET请求GetAll它可以找到。 要解决这一点,你需要定义包括动作的名称的路线:

config.Routes.MapHttpRoute( 
   name: "ActionApi", 
   routeTemplate: "api/{controller}/{action}/{id}", 
   defaults: new { id = RouteParameter.Optional } 
);

之后,你可以让明星用下列URL的请求:

  • API / yourapicontroller / GetClients
  • API / yourapicontroller / GetStaffMembers

这样你可以有多个GetAll的控制器。

这里的一个更重要的是,这种风格的路由,则必须使用属性来指定允许的HTTP方法(如[HTTPGET])。

也有与传统方法默认的Web API基于动词路由的混合选项,这是很好的描述如下:

  • 网络API:将传统和基于动词路由


Answer 2:

万一别人面临着这个问题。 以下是我解决了这个。 使用控制器上的[路径]属性路由到特定的URL。

[Route("api/getClient")]
public ClientViewModel GetClient(int id)

[Route("api/getAllClients")]
public IEnumerable<ClientViewModel> GetClients()


文章来源: Api controller declaring more than one Get statement