2017-07-26 5 views
2

Angenommen, ich diese URL haben:Wie behandle ich mehrere Parameter als OR in einer Web-API-Abfragezeichenfolge?

api.XXX.com/cities?risk=a,b&rating=x,y 

Was ich will, eine Liste von Städten mit einer Risikokategorie A oder B und eine Bewertung von X oder Y. Wie soll ich dies implementieren ist?

Ich verstehe, ich kann die Werte der Risiko-und Rating-Schlüssel, aber was dann? Ist es am besten, die Zeichenfolge einfach zu analysieren und eine switch Anweisung zu verwenden? Oder gibt es einen besseren Ansatz?

+0

Der einfachste Weg besteht darin, die Daten im Anfragetext als JSON anstatt als Abfragezeichenfolgen zu veröffentlichen. – Win

+0

@Win - Ich dachte, dass alles, was ich lese, darauf hindeutet, dass es ein GET ist. Außerdem ist es für mich einfacher, Unterstützung zu erhalten, wenn es sich um eine schreibgeschützte API handelt. Die Verwendung von POST würde wahrscheinlich einige Flags aufwerfen und Diskussionen erschweren. – DenaliHardtail

+0

Sie können dieses komplexe Objekt in der Abfragezeichenfolge nicht erstellen. – Win

Antwort

5

Ein Standardansatz wäre:

api.XXX.com/cities?risks=a&risks=b&ratings=x&ratings=y 

, die durch eine Controller-Aktion so etwas wie dies gehandhabt werden könnte:

[HttpGet] 
public async Task<IHttpActionResult> SearchCities(
    List<string> risks, 
    List<string> ratings) 
{ 
    var results = this.dbContext.Cities.AsQueryable(); 
    if(risks.Any()) 
    { 
     results = results.Where(c => c.Risks.Any(cr => risks.Contains(cr.Code)); 
    } 
    if(ratings.Any()) 
    { 
     results = results.Where(c => ratings.Contains(c.Rating)); 
    } 
    ... 
} 

Ähnliche Antwort here.

0

Ich würde empfehlen, ein POCO Schaffung die Möglichkeiten darzustellen, die dieser Endpunkt empfangen wird:

public class CitySearchOptions 
{ 
    public List<string> Risk { get; set; } 
    public List<string> Rating { get; set; } 
} 

Sie können dann mit dem [FromUri] Attribute in Ihrer Controller Unterschrift des Query-String automatisch in Ihre deserialisiert wird POCO. Von dort können Sie leicht eine Logik implementieren, um auf die empfangenen Werte einzuwirken.

public async Task<IHttpActionResult> SearchCities([FromUri] CitySearchOptions options) 

Beachten Sie, dass die obige Pseudo-Code ist und vielleicht nicht ohne ein paar kleine Änderungen an dem Format der Abfrage-String aus der Box für Sie arbeiten. This question schlägt vor, dass für die Liste Abfrage params Sie ein Format wie diese bevorzugen sollten:

/cities?risk=a&risk=b&rating=x&rating=y 
Verwandte Themen