Maison  >  Article  >  développement back-end  >  Explication détaillée des exemples de routage d'attributs ASP.NET de l'API WEB

Explication détaillée des exemples de routage d'attributs ASP.NET de l'API WEB

Y2J
Y2Joriginal
2017-04-25 15:49:222164parcourir

Les routes MVC suivantes sont conventionnelles

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

Si nous voulons obtenir un routage avec des effets similaires à ceux suivants, il est plus difficile d'utiliser un routage conventionnel.

order/Miles/三只松鼠干果/2袋
order/2017/1/13

Ce serait plus simple si vous utilisiez le routage d'attributs.

Pour créer un nouveau projet WEB API, ouvrez le fichier WebApiConfig.cs dans le répertoire App_Start et ajoutez le code suivant pour activer la configuration du routage des attributs.

 config.MapHttpAttributeRoutes();

Le routage par attributs peut également être mélangé avec le routage par convention, comme suit :

 public static void Register(HttpConfiguration config)
    {
      // Web API 配置和服务

      // Web API 路由
      config.MapHttpAttributeRoutes();

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

Mettez une marque de fonctionnalité sur la méthode pour utiliser le routage par attribut, comme suit :

 [Route("order/{UserNickName}/{ProductName}/{count}")]

Résultats des tests (l'URL est codée, sinon une erreur 400 sera signalée.)


Normalement, toutes les routes d'un même contrôleur commencent par Le même préfixe commençant par

  [Route("api/books")]
  [Route("api/books/{id:int}")]
  [Route("api/books")]

est évidemment plus gênant. Nous utilisons donc l'attribut [RoutePrefix] pour définir un préfixe public

Résultat du test

Si [RoutePrefix est ​​utilisé ], pour certaines API spéciales, nous pouvons utiliser des lignes ondulées pour réécrire le préfixe de routage, comme suit :

Résultats des tests (sous la même classe)

Le préfixe de routage peut également contenir des paramètres, comme suit

Résultats des tests


Vous pouvez ajouter des contraintes de paramètres dans l'itinéraire, comme suit

Résultats des tests

Si le paramètre n'est pas de type Int, l'itinéraire ne correspondra pas

Voici quelques contraintes qui seront prises en charge

Vous pouvez utiliser plusieurs contraintes, mais utilisez des deux-points pour séparer

[Route("users/{id:int:length(1,3)}")]
public User GetUserById(int id) { ... }

Le résultat

S'il n'est pas dans la plage, il ne correspondra pas

Les contraintes de routage personnalisées doivent implémenter l'interface IHttpRouteConstraint, veuillez consulter le site officiel pour plus de détails

public class NonZeroConstraint : IHttpRouteConstraint
{
  public bool Match(HttpRequestMessage request, IHttpRoute route, string parameterName, 
    IDictionary<string, object> values, HttpRouteDirection routeDirection)
  {
    object value;
    if (values.TryGetValue(parameterName, out value) && value != null)
    {
      long longValue;
      if (value is long)
      {
        longValue = (long)value;
        return longValue != 0;
      }

      string valueString = Convert.ToString(value, CultureInfo.InvariantCulture);
      if (Int64.TryParse(valueString, NumberStyles.Integer, 
        CultureInfo.InvariantCulture, out longValue))
      {
        return longValue != 0;
      }
    }
    return false;
  }
}

Enregistrer les contraintes

public static class WebApiConfig
{
  public static void Register(HttpConfiguration config)
  {
    var constraintResolver = new DefaultInlineConstraintResolver();
    constraintResolver.ConstraintMap.Add("nonzero", typeof(NonZeroConstraint));

    config.MapHttpAttributeRoutes(constraintResolver);
  }
}

Utiliser les contraintes

[Route("{id:nonzero}")]
public HttpResponseMessage GetNonZero(int id) { ... }

Paramètres URI facultatifs et valeurs par défaut

Vous pouvez faire d'un paramètre d'itinéraire un paramètre URI facultatif en ajoutant un point d'interrogation pour le marquer. Si un paramètre de route est facultatif, vous devez définir une valeur par défaut pour le paramètre de méthode.

public class BooksController : ApiController
{
  [Route("api/books/locale/{lcid:int?}")]
  public IEnumerable<Book> GetBooksByLocale(int lcid = 1033) { ... }
}

Ou définir la valeur par défaut dans le modèle de routage

public class BooksController : ApiController
{
  [Route("api/books/locale/{lcid=1033}")]
  public IEnumerable<Book> GetBooksByLocale(int lcid) { ... }
}

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn