Maison > Article > développement back-end > Explication détaillée des exemples de routage d'attributs ASP.NET de l'API WEB
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!