8

Je construis une API pour Twitter comme site en utilisant l'API Web et ont des problèmes avec la cartographie des routesComment cartographier les itinéraires de WebAPI correctement

je les actions suivantes pour le contrôleur de l'utilisateur:

public User Get(string firstname, string lastname) 
public User Get(Guid id) 
public User Friends(Guid id) 
public User Followers(Guid id) 
public User Favorites(Guid id) 

les routes désirées et la documentation générée doit être:

api/users?firstname={firstname}&lastname={lastname} 
api/users/{id} 
api/users/{id}/friends 
api/users/{id}/followers 
api/users/{id}/favorites 

En WebApiConfig.cs j'ai:

config.Routes.MapHttpRoute(
    "2", 
    "api/{controller}/{id}", 
    new { action = "get", id = RouteParameter.Optional } 
); 


config.Routes.MapHttpRoute(
    "1", 
    "api/{controller}/{id}/{action}" 
); 

Comment puis-je mapper les routes WebAPI correctement?

Répondre

0

Il existe une variété de matériaux de référence utiles à ce sujet, tels que:

Avez-vous eu un coup d'œil à ces?

mise à jour ..

Sa meilleure pratique explicitement quel paramètre qui, à savoir:

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

    config.Routes.MapHttpRoute(
     name: "1", 
     routeTemplate: "api/{controller}/{action}/{id}", 
     defaults: null 
    ); 

principale chose que je pouvais voir était mal que vous aviez l'action/id dans le mauvais ordre dans route "1".

+0

regardé à tous ces – Donny

+0

Mis à jour ma réponse – MikeDub

19

Compte tenu de la flexibilité que vous voulez, vous devriez jeter un oeil à

Attribute Routing in ASP.NET Web API 2

Dans WebApiConfig.cs permettent attribut de routage comme

// Web API routes 
config.MapHttpAttributeRoutes(); 

Dans UserController

Remarque compte tenu de la noms d'actions Friends, Followers and Favorites ils impliquent le retour Utilisation des collections plutôt que d'un seul utilisateur

[RoutePrefix("api/users")] 
public class UserController: ApiController { 

    //eg: GET api/users?firstname={firstname}&lastname={lastname} 
    [HttpGet] 
    [Route("")] 
    public User Get([FromUri]string firstname,[FromUri] string lastname) {...} 

    //eg: GET api/users/{id} 
    [HttpGet] 
    [Route("{id:guid}")] 
    public User Get(Guid id){...} 

    //eg: GET api/users/{id}/friends 
    [HttpGet] 
    [Route("{id:guid}/friends")] 
    public IEnumerable<User> Friends(Guid id){...} 

    //eg: GET api/users/{id}/followers 
    [HttpGet] 
    [Route("{id:guid}/followers")] 
    public IEnumerable<User> Followers(Guid id){...} 

    //eg: GET api/users/{id}/favorites 
    [HttpGet] 
    [Route("{id:guid}/favorites")] 
    public IEnumerable<User> Favorites(Guid id){...} 
} 
5

Le routage dépend de la commande. Le premier match gagne toujours. Il est donc important que vous commandiez des itinéraires de la plus spécifique à la moins spécifique.

// All parameters are required, or it won't match. 
// So it will only match URLs 4 segments in length 
// starting with /api. 
config.Routes.MapHttpRoute(
    "1", 
    "api/{controller}/{id}/{action}" 
); 

// Controller is required, id is optional. 
// So it will match any URL starting with 
// /api that is 2 or 3 segments in length. 
config.Routes.MapHttpRoute(
    "2", 
    "api/{controller}/{id}", 
    new { action = "get", id = RouteParameter.Optional } 
); 

Lorsque vos routes sont ordonnées de cette façon, vous obtiendrez le comportement que vous attendez.