Plusieurs parameters de chaîne de requête facultatifs REST API GET

J’utilise Web api 2 pour mettre en place un service reposant. Après avoir effectué des recherches sur les meilleures pratiques, tout le monde semble avoir des opinions divergentes sur la manière de procéder. J’ai un GET

public HttpResponseMessage Get(ssortingng crewId, ssortingng shiftDate, int offset = 1, int limit = 10) 

Cette méthode GET renvoie une liste. Il existe plusieurs façons d’obtenir les données de cette méthode.

  • Obtenir par crewId seulement
  • Get by shiftDate uniquement
  • ou

  • Obtenir par crewId et shiftDate
  • Est-ce que vous (1) marquez crewId et shiftDate comme optionnels?

     public HttpResponseMessage Get(ssortingng crewId = null, ssortingng shiftDate = null, int offset = 1, int limit = 10) 

    et puis avoir un tas de si déclarations pour vérifier ce qui est rempli et ce qui n’est pas rempli pour pouvoir faire des actions

     if(crewId != null && shiftDate == null){ // Get by crewId }else if(crewId == null && shiftDate != null){ // Get By shiftDate }else if(crewId != null && shiftDate != null){ // Get By crewId and shiftDate } 

    Pour moi, cela semble fou, surtout si vous avez beaucoup de parameters, vous auriez trop d’énoncés “if” dans votre code.

    Avez-vous (2) un ensemble différent d’objectives?

     public HttpResponseMessage GetByCrewId(ssortingng crewId, int offset = 1, int limit = 10) public HttpResponseMessage GetByShiftDate(ssortingng shiftDate, int offset = 1, int limit = 10) public HttpResponseMessage GetByCrewIdShiftDate(ssortingng crewId, ssortingng shiftDate, int offset = 1, int limit = 10) 

    et puis vous auriez votre carte URI Route à la méthode

  • … / api / GetByCrewId? crewId = 1234
  • … / api / GetByShiftDate? shiftDate = 1111-11-11
  • … / api / GetByCrewIdShiftDate? crewId = 1234 & shiftDate = 1111-11-11
  • l’option 2 est-elle reposante?

    Ou existe-t-il de meilleures options (3).

    Les deux options ci-dessus fonctionnent uniquement en m’assurant d’utiliser les meilleures pratiques et de respecter les normes REST. Il me semble que quelque chose me manque et j’espère que vous pourrez me mettre dans la bonne direction.

    Vous ne voulez pas l’option (2) – pour être RESTeux, vous voulez des noms dans votre URL.

    Donc, vous voulez que votre URL ressemble à ceci:

     /api/items/?crewId=1234&shiftDate=1111-11-11 

    (Je ne peux pas déterminer quels sont vos éléments, en fonction des noms de paramètre ‘Crew’ et ‘Shift’. Qu’est-ce qui a une date d’équipage et une date de décalage? Voyages de pêche ?? Si oui, l’URL serait meilleure comme / api / sorties-de-pêche /? crewId = …. & shiftDate = …

    En ce qui concerne le contrôleur, je choisirais quelque chose comme:

     public HttpResponseMessage Get(ssortingng crewId = null, ssortingng shiftDate = null, int offset = 1, int limit = 10) { return dataSource.Where(x=> (x.CrewId == crewId || crewId == null) && (x.ShiftDate == shiftDate || shiftDate == null)); } 

    J’ai déjà fait quelque chose comme ça avant. Puisque vous pouvez utiliser l’un ou l’autre ou les deux, j’utiliserais les parameters facultatifs:

     public HttpResponseMessage Get(ssortingng crewId = null, ssortingng shiftDate = null, int offset = 1, int limit = 10) 

    Puis construisez votre requête. Par exemple, quelque chose comme ceci:

     var query = ""; if (!Ssortingng.IsNullOrEmpty(crewId)) { query += $"crewId='{crewId}'"; } if (!Ssortingng.IsNullOrEmpty(shiftDate)) { if (query.Length > 0) query += " AND "; query += $"shiftDate='{shiftDate}'"; } if (query.Length == 0) { //neither crewId or shiftDate were given //return some kind of error } 

    Examen des meilleures pratiques: Comprendre les en-têtes et les parameters REST indique que l’utilisation du paramètre de requête indiquerait qu’il est facultatif. Si vous pouvez rendre une seule valeur requirejse et les autres facultatives, cela peut aider à clarifier l’URI.

     /api/fishing-sortingps/crew/{crewid}?shiftdate=1111-11-11 

    En fin de compte, si vos éléments sont tous facultatifs, utilisez le “?” est probablement le meilleur itinéraire. Des informations complémentaires sur les types de parameters sont disponibles sur RFC 6570 .

    Notez que votre choix peut avoir un impact sur la mise en queue que vous choisissez d’utiliser et le développement des parameters de type chemin peut s’avérer plus judicieux. Plus d’informations à la rubrique Présentation des parameters REST .

    Enfin, vous souhaiterez peut-être créer ces parameters en tant que parameters de recherche. Si vous constatez que vos utilisateurs demandent souvent la même recherche, vous pouvez la regrouper dans un seul chemin REST.

    Par exemple,

     /api/fishing-sortingps/search?crew=1234 /api/fishing-sortingps/search?shiftDate=1111-11-11 /api/fishing-sortingps/search?crew=1234&shiftDate=1111-11-11 

    Vous pouvez également fournir une simplification avec des parameters facultatifs, par exemple,

     /api/fishing-sortingps/today /api/fishing-sortingps/today?crew=1234 /api/fishing-sortingps/crew/1234/today 

    Ces derniers exemples sont subjectifs, mais plus d’informations sont disponibles dans Meilleures pratiques pour une API Pragmatic Rest et pour une conception d’URL RESTful pour la recherche .

    Considérant que je suis sur le point d’implémenter cela moi-même, je dirai que cela devrait être une action de méthode GET unique avec plusieurs parameters facultatifs.

    Pourquoi? Parce que vous ne devriez pas vous inquiéter de cette logique de requête dans la couche d’API REST. Après tout, vous créez effectivement une clause de discrimination AND avec plusieurs parameters (par exemple, CrewId = 1 AND ShiftDate = 2016-01-01 ). Et si vous ne fournissez pas de parameters, renvoyez tous les éléments.

    Je transmettrai mes parameters tout au long d’une procédure stockée SQL contenant des valeurs par défaut et renverra les résultats en fonction des parameters transmis.

    N’oubliez pas que, de nombreuses manières, les méthodes REST mappent directement vers CRUD, alors traitez votre API comme telle: Didacticiel API REST