web-dev-qa-db-fra.com

Routes d'API Web pour prendre en charge à la fois GUID et les ID entiers

Comment puis-je prendre en charge les itinéraires GET pour les deux GUID et entier? Je me rends compte que les GUID ne sont pas idéaux, mais c'est ce qu'ils sont pour le moment. Je souhaite ajouter la prise en charge de des entiers pour permettre aux utilisateurs de se souvenir et de communiquer plus facilement ce que devrait être "clés" uniques.

Exemples d'itinéraires:

testcases/9D9A691A-AE95-45A4-A423-08DD1A69D0D1   
testcases/1234

Mon WebApiConfig:

public static void Register(HttpConfiguration config)
{
    config.MapHttpAttributeRoutes();
    var routes = config.Routes;

    routes.MapHttpRoute("DefaultApiWithAction", 
        "Api/{controller}/{action}");

    routes.MapHttpRoute("DefaultApiWithKey",
        "Api/{controller}/{key}",
        new { action = "Get" },
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Get), key = @"^\d+$" });

    routes.MapHttpRoute("DefaultApiWithId", 
        "Api/{controller}/{id}", 
        new { action = "Get" }, 
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

    routes.MapHttpRoute("DefaultApiGet", 
        "Api/{controller}", 
        new { action = "Get" }, 
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Get) });

    routes.MapHttpRoute("DefaultApiPost", 
        "Api/{controller}", 
        new { action = "Post" }, 
        new { httpMethod = new HttpMethodConstraint(HttpMethod.Post) });
}

Mon contrôleur (signatures de méthode uniquement):

[RoutePrefix("Api/TestCases")]
public class TestCasesController : PlanControllerBase
{
    [Route("")]
    public OperationResult<IEnumerable<TestCaseDTO>> Get([FromUri] TestCaseRequest request)

    [Route("{id}")]
    [HttpGet]
    public OperationResult<TestCaseDTO> Get(Guid id)

    [Route("{key}")]
    [HttpGet]
    public OperationResult<TestCaseDTO> Get(int key)

    ...
}

J'obtiens une Erreur de serveur interne lorsque j'essaie d'appeler la ressource à l'aide de l'entier. Toute aide est appréciée!

22
gopherr

Merci à @SirwanAfifi! J'étais tombé sur l'article Attribute Routing in ASP.NET mentionné dans la question SO que vous avez mentionnée, mais apparemment, je ne voyais pas la nécessité de contraintes d'attribut d'itinéraire à l'époque.

Pour moi, c'est l'utilisation de [Route("{id:guid}")] et [Route("{key:int}")] sur mes méthodes de contrôleur qui a fait l'affaire. J'ai également commenté les itinéraires Http liés à {id} et {key} dans mon WebApiConfig pour vérifier que les attributs du contrôleur sont responsables du routage.

25
gopherr