2012-04-12 22 views
42

在MVC4中使用新的Api控制器,我發現一個問題。如果我有以下幾種方法:Api控制器聲明多個Get語句

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

這將工作。但是,如果我想要檢索不同類型的一些不同的數據,則默認爲GetAll方法,即使$.getJSON設置爲GetAllIntegers方法:

public IEnumberable<int> GetAllIntergers()

(壞的命名約定)

我可以做到這一點嗎?

Web API控制器中只能有一個GetAll方法嗎?

我覺得想要實現我想要的更容易。下面是一個代碼片段,顯示想我是能夠做到的,在一個單一的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 
} 

回答

62

這是所有路由。默認的Web API路由如下所示:

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

使用缺省路由模板,Web API使用HTTP方法來選擇操作。結果它會將沒有參數的GET請求映射到它可以找到的第一個GetAll。要解決這一點,你需要定義包括動作的名稱路線:

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

之後,你可以明星以下網址發出請求:

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

這樣你可以在控制器中有多個GetAll

這裏還有一件重要的事情是,在使用這種路由方式時,必須使用屬性來指定允許的HTTP方法(如[HttpGet])。

還擁有傳統的方法默認的Web API動詞基於路由的混合選項,這是很好的描述如下:

+0

快速的問題,我可以路線是這樣,仍然叫我的方法只有「郵報」和讓它們自動只接受HttpPost如果我包括ActionNameAttribute? – Alxandr 2012-05-05 23:14:37

+0

@Alxandr您仍然必須使用AcceptVerbsAttribute(或HttpPostAttribute,HttpGetAttribute等) – tpeczek 2012-05-06 17:40:52

+3

我有一些問題,路由 - 我可以定義多個「GET」方法,但如果我打/ API/{}控制器服務器給HTTP 500「找到多個動作」而不是404。任何想法如何阻止這個?我想要的是將/ api/{controller}/{id}路由到「Get,Post,Put,Delete等」,然後讓/ api/{controller}/{id}/{action}路由到一個特定的動作,例如/ api/Customers/5/Products。不起作用 - 一切都會導致「發現多個操作」錯誤。 – ShadowChaser 2012-05-16 16:04:24

9

萬一別人面臨着這個問題。這是我解決這個問題的方法。使用控制器上的[Route]屬性路由到特定的URL。

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

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

路由屬性鏈接對於那些甚至更好奇這種格式是什麼:https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute-路由功能於Web的API-2 – Callat 2017-06-19 20:16:57