wake-up-neo.com

Mehrere optionale Abfragezeichenfolgeparameter REST API GET

Ich verwende Web API 2, um einen restful Service zu implementieren. Nach einigen Recherchen zu Best Practices scheint jeder zu sein, dass er unterschiedliche Meinungen darüber hat, wie das Folgende zu tun ist. Ich habe ein GET 

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

Diese GET-Methode gibt eine Liste zurück. Es gibt mehrere Möglichkeiten, die Daten von dieser Methode abzurufen. 

  • Holen Sie sich nur von crewId
  • Holen Sie sich nur nach shiftDate
  • oder
  • Get by crewId und shiftDate
  • Markieren Sie (1) die crewId und das shiftDate als optional? 

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

    und dann eine Reihe von if-Anweisungen, um zu überprüfen, was gefüllt ist und was nicht, um Aktionen ausführen zu können

    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
    }
    

    Für mich sieht das verrückt aus, vor allem wenn Sie viele Parameter haben, würden Sie zu viele "if" -Anweisungen in Ihrem Code haben.

    Hast du (2) unterschiedliche Sets?

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

    und dann hätten Sie Ihre URI-Route der Methode zugewiesen 

  • .../api/GetByCrewId? crewId = 1234
  • .../api/GetByShiftDate? shiftDate = 1111-11-11
  • .../api/GetByCrewIdShiftDate? crewId = 1234 & shiftDate = 1111-11-11
  • ist Option 2 erholsam?

    Oder gibt es bessere Optionen (3)?.

    Beide oben genannten Optionen funktionieren nur, indem ich mich vergewissere, dass ich Best Practices verwende und die Standards REST befolge. Es scheint so, als würde mir etwas fehlen und hoffentlich kannst du mich in die richtige Richtung bringen.

    7
    Nick Manojlovic

    Sie möchten keine Option (2) - um REST-fähig zu sein, möchten Sie Substantive in Ihrer URL.

    Sie möchten also, dass Ihre URL so aussieht:

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

    (Ich kann nicht herausfinden, was Ihre Items sind, basierend auf den Parameternamen 'Crew' und 'Shift'. Was hat eine Crew und ein Shift-Datum? Angeltrips ?? Wenn ja, wäre die URL besser als/api/fishing-trips /? crewId = .... & shiftDate = ...

    Was den Controller angeht, würde ich für Folgendes gehen:

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

    Review Best Practices: REST -Header und -Parameter verstehen besagt, dass die Verwendung des Abfrageparameters darauf hinweist, dass er optional ist. Wenn Sie einen einzelnen Wert angeben können und die anderen optional, kann dies zur Klärung des URI beitragen.

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

    Wenn Ihre Artikel am Ende optional sind, verwenden Sie das "?" ist wahrscheinlich die beste Route. Weitere Informationen zu den Parametertypen finden Sie unter RFC 6570

    Beachten Sie, dass Ihre Auswahl Auswirkungen auf die Warteschlangen haben kann, die Sie verwenden, und die Erweiterung der Pfadstilparameter ist möglicherweise am sinnvollsten. Weitere Informationen finden Sie auch unter Parameter REST verstehen .

    Zuletzt möchten Sie diese als Suchparameter erstellen. Wenn Sie feststellen, dass Ihre Benutzer häufig dieselbe Suche anfordern, können Sie sie in einen einzigen REST - Pfad packen.

    Zum Beispiel,

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

    Sie können auch eine Vereinfachung zusammen mit optionalen Parametern angeben, z. B.

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

    Diese letzten Beispiele sind subjektiv aus meiner Forschung, aber weitere Informationen finden Sie unter Best Practices für ein Pragmatic Rest API und RESTful URL-Design für die Suche .

    2
    McArthey

    Ich habe so etwas schon einmal gemacht. Da Sie den einen oder den anderen oder beide verwenden können, würde ich die optionalen Parameter verwenden:

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

    Dann konstruieren Sie Ihre Anfrage. Zum Beispiel so etwas:

    var query = "";
    if (!String.IsNullOrEmpty(crewId)) {
      query += $"crewId='{crewId}'";
    }
    if (!String.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
    }
    
    2
    Gabriel Luci

    In Anbetracht dessen, dass ich dabei bin, dies selbst zu implementieren, werde ich sagen, dass es sich um eine einzelne GET-Methodenaktion mit mehreren optionalen Parametern handeln sollte. 

    Warum? Sie sollten sich nicht um diese Abfragelogik in der API-Ebene REST kümmern. Schließlich erstellen Sie effektiv eine AND Diskriminierungsklausel mit mehreren Parametern (d. H. CrewId = 1 AND ShiftDate = 2016-01-01). Wenn Sie keine Parameter angeben, geben Sie alle Elemente zurück.

    Ich werde meine Parameter durchgehend an eine gespeicherte SQL-Prozedur übergeben, für die Standardwerte festgelegt wurden und die Ergebnisse basierend auf den übergebenen Parametern zurückgegeben werden.

    Denken Sie daran, dass REST -Methoden auf viele Arten direkt CRUD zugeordnet werden. Behandeln Sie Ihre API daher wie folgt: REST API-Tutorial

    1
    toadflakz