2012-04-12 14 views
42

Sử dụng Bộ điều khiển Api mới trong MVC4 và tôi đã tìm thấy sự cố. Nếu tôi có các phương pháp sau:Bộ điều khiển api khai báo nhiều câu lệnh Get

public IEnumberable<string> GetAll()

public IEnumberable<string> GetSpecific(int i)

này sẽ làm việc. Tuy nhiên, nếu tôi muốn lấy một số dữ liệu khác nhau của một loại khác nhau, nó mặc định là phương pháp GetAll, mặc dù $.getJSON được thiết lập để các GetAllIntegers phương pháp:

public IEnumberable<int> GetAllIntergers()

(quy ước đặt tên xấu)

Tôi có thể làm điều này không?

Tôi chỉ có thể có một phương thức GetAll đơn trong bộ điều khiển API Web không?

Tôi nghĩ rằng sẽ dễ dàng hơn để hình dung những gì tôi đang cố gắng đạt được. Dưới đây là một đoạn mã để hiển thị những gì tôi muốn có thể làm, trong một đơn 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 
} 

Trả lời

62

Đây là tất cả trong định tuyến. Tuyến đường Web API mặc định trông giống như sau:

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

Với mẫu định tuyến mặc định, Web API sử dụng phương thức HTTP để chọn hành động. Kết quả là nó sẽ ánh xạ một yêu cầu GET mà không có tham số cho GetAll đầu tiên mà nó có thể tìm thấy. Để làm việc xung quanh này, bạn cần phải xác định một con đường nơi tên hành động được bao gồm:

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

Sau đó bạn có thể sao làm cho các yêu cầu với sau URL:

  • api/yourapicontroller/GetClients
  • api/yourapicontroller/GetStaffMembers

Bằng cách này bạn có thể có nhiều GetAll trong Bộ điều khiển.

Một điều quan trọng nữa ở đây là với kiểu định tuyến này, bạn phải sử dụng các thuộc tính để chỉ định các phương thức HTTP được phép (như [HttpGet]).

Ngoài ra còn có một tùy chọn trộn mặc định động từ Web API dựa trên định tuyến với cách tiếp cận truyền thống, nó được mô tả rất tốt ở đây:

+0

Câu hỏi nhanh, tôi có thể định tuyến như thế này và vẫn gọi các phương thức của tôi chỉ "Đăng" và yêu cầu chúng tự động chấp nhận HttpPost nếu tôi bao gồm một ActionNameAttribute? – Alxandr

+0

@Alxandr Bạn vẫn sẽ phải sử dụng AcceptVerbsAttribute (hoặc HttpPostAttribute, HttpGetAttribute vv) – tpeczek

+3

Tôi đang gặp một số vấn đề với định tuyến - Tôi có thể định nghĩa nhiều phương thức "GET", nhưng nếu tôi nhấn/api/{controller} máy chủ cung cấp cho một HTTP 500 "nhiều hành động tìm thấy" thay vì một 404. Bất kỳ ý tưởng làm thế nào để ngăn chặn điều này? Những gì tôi muốn là có/api/{controller}/{id} route để "Get, Post, Put, Delete, etc", sau đó có/api/{controller}/{id}/{action} để một hành động cụ thể, chẳng hạn như/api/Khách hàng/5/Sản phẩm. Không hoạt động - mọi thứ đều cung cấp lỗi "tìm thấy nhiều hành động". – ShadowChaser

9

Trong trường hợp người khác phải đối mặt với vấn đề này. Đây là cách tôi giải quyết vấn đề này. Sử dụng thuộc tính [Route] trên bộ điều khiển của bạn để định tuyến đến một url cụ thể.

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

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

liên kết thuộc tính tuyến đường cho những người tò mò hơn về định dạng này là gì: https://docs.microsoft.com/en-us/aspnet/web-api/overview/web-api-routing-and-actions/attribute- định tuyến-trong-web-api-2 – Callat