0

У меня есть следующий (стандарт) WebApiConfig:WebAPI маршрутизация - много методов GET

public static void Register(HttpConfiguration config) 
{ 
    // Web API configuration and services 
    // Configure Web API to use only bearer token authentication. 
    config.SuppressDefaultHostAuthentication(); 
    config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType)); 

    // Web API routes 
    config.MapHttpAttributeRoutes(); 

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

и следующий контроллер API:

[RoutePrefix("api/books")] 
public class BooksController : ApiController 
{ 
    // GET api/Books 
    [Route("")] 
    public IQueryable<string> GetBooks() 
    { 
     return null; 
    } 

    // GET api/Books/5 
    [Route("{id:int}")] 
    public async Task<IHttpActionResult> GetBook(int id) 
    { 

     return Ok(); 
    } 

    [Route("{id:int}/details")] 
    public async Task<IHttpActionResult> GetBookDetail(int id) 
    { 
     return Ok(); 
    } 

    [Route("abc")] 
    public IQueryable<string> GetBooksByGenre(string genre) 
    { 
     return null; 
    } 

    [Route("~api/authors/{authorId}/books")] 
    public IQueryable<string> GetBooksByAuthor(int authorId) 
    { 
     return null; 

    } 
} 

Было установлено, подходящий метод, когда я называю

  • api/books
  • api/books/1
  • api/books/1/details

, но он не может найти api/books/abc.

Если я меняю [Route("abc")] на [Route("{genre}")], он работает (передайте abc как параметр жанра).

Но мне нужно иметь много методов GET с разными именами.

Что я сделал не так?

ответ

1

Попробуйте

// GET api/Books/genres/horror 
[Route("genres/{genre}")] 
public IQueryable<string> GetBooksByGenre(string genre) 
{ 
    return null; 
} 

Или даже

// GET api/genres/horror/books 
[Route("~api/genres/{genre}/books")] 
public IQueryable<string> GetBooksByGenre(string genre) 
{ 
    return null; 
} 
+0

спасибо, но на самом деле мне нужно методы POST :) Я думал, что это было бы то же самое, но он не работает должным образом для POST: ( –

+0

Нет, где в вашем OP указано, что вам нужен POST. Используйте атрибут HttpPost для методов POST. Читайте в [Маршрутизация атрибутов] (http://www.asp.net/web-api/overview/web-api -routing-and-actions/attribute-routing-in-web-api-2 # add-routes) – Nkosi

+0

Я спрашиваю здесь http://stackoverflow.com/questions/35975701/webapi-routing-many-post-methods –

Смежные вопросы