2012-09-27 36 views
24

Tôi đang cố định cấu hình định tuyến trong dự án MVAP4 WebAPI của mình.Định tuyến dựa trên tên tham số chuỗi truy vấn

Tôi muốn để có thể tìm kiếm các sản phẩm dựa trên tên của họ hoặc loại của họ như vậy:

/api/products?name=WidgetX - trả về tất cả các sản phẩm được đặt tên WidgetX /api/products?type=gadget - trả về tất cả sản phẩm thuộc loại tiện ích

Các đường bay được định cấu hình như sau:

config.Routes.MapHttpRoute(
    name: "Get by name", 
    routeTemplate: "api/products/{name}", 
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByName", name = string.Empty } 
); 

config.Routes.MapHttpRoute(
    name: "Get by type", 
    routeTemplate: "api/products/{type}", 
    defaults: new { controller = "ProductSearchApi", action = "GetProductsByType", type = string.Empty } 
); 

Vấn đề là tên của tham số chuỗi truy vấn dường như bị bỏ qua nên tuyến đường đầu tiên luôn được sử dụng, bất kể tên của tham số chuỗi truy vấn. Làm cách nào để sửa đổi tuyến đường của tôi?

Trả lời

30

Những gì bạn cần chỉ là chỉ có một con đường dưới đây vì chuỗi truy vấn không được sử dụng như các thông số định tuyến:

config.Routes.MapHttpRoute(
    name: "Get Products", 
    routeTemplate: "api/products", 
    defaults: new { controller = "ProductSearchApi" } 
); 

Và, sau đó xác định hai phương pháp như dưới đây:

GetProductsByName(string name) 
{} 

GetProductsByType(string type) 
{} 

Routing cơ chế là thông minh đủ để định tuyến url của bạn đến hành động chính xác của bạn dựa trên tên của chuỗi truy vấn cho dù cùng với thông số đầu vào hay chưa. Dĩ nhiên trên tất cả các phương pháp với tiền tố là Get

Bạn có thể cần phải đọc: http://www.asp.net/web-api/overview/web-api-routing-and-actions/routing-and-action-selection

0

hãy thử thay đổi string.Empty cho RouteParameter.Optional

+0

RouteParameter sẽ làm cho tôi sử dụng url như/products/abc mà sẽ đương nhiên không đáp ứng yêu cầu. Tôi cần để có thể sử dụng tham số chuỗi truy vấn. – rickythefox

4

Bạn không cần phải bao gồm các thông số truy vấn của bạn trong con đường. Chỉ nên có một bản đồ lộ trình đơn giản để trang trải các phương pháp Http trên tất cả các ApiControllers của bạn:

routes.MapHttpRoute(
    name: "DefaultApi", 
    routeTemplate: "api/{controller}/{id}", 
    defaults: new { id = RouteParameter.Optional } 
); 

Thời gian duy nhất bạn cần phải điều chỉnh các tuyến đường là nếu bạn muốn di chuyển một tham số vào con đường thực tế mà bạn dường như không được làm. Sau đó, phương pháp GET http của bạn để tìm kiếm theo hai lĩnh vực sẽ là:

public IEnumerable<Product> Get(string name, string type){ 
    //..your code will have to deal with nulls of each parameter 
} 

Nếu bạn muốn tìm kiếm một cách rõ ràng theo một trường tại một thời điểm sau đó bạn nên suy nghĩ về việc sử dụng các bộ điều khiển khác nhau cho các mục đích khác nhau. Tức là, một SearchProductByTypeController có một phương thức Get(string type). Sau đó, tuyến đường sẽ là/api/SearchProductByTypeController? Type = gadget

+0

Cảm ơn, đôi khi vấn đề không có trong mã nhưng trong kiến ​​trúc. ;) – rickythefox

+1

Loại tài nguyên nào là 'SearchProductByTypeController'? : P –

0

Bạn có chắc chắn rằng các bộ điều khiển có ổn không? Ý tôi là, tên của params.

public string GetProductsByName(string name) 
    { 
     return "Requested name: " + name; 
    } 

    public string GetProductsByType(string type) 
    { 
     return "Requested type: " + type; 
    } 
Các vấn đề liên quan