2016-08-31 3 views
-1

Ich habe eine Liste von http Wegen und Methoden. Ex:URL passend nicht iterativ

GET /spaceshuttles/{id} 
POST /{version}/order 

Von dem, was ich verstehe, wenn es gibt eine eingehende Anforderung, diese Pfade werden iterativ verglichen, bei dem ersten Spiel zu stoppen. Meine Frage ist - hat das einen Leistungseinbruch? Was ist, wenn es einen Service gibt, der 1000 eingehende Routen abwickelt, wie hoch wäre der Performance-Hit?

Selbst wenn der Treffer klein ist, gibt es eine saubere Strategie, um URLs mit einer Baum/Trie-ähnlichen Matching-Strategie zu vergleichen? Wenn ja, was dann? Zum Beispiel: Ich möchte eine eingehende URL einer dieser URLs zuordnen, ohne für eine Übereinstimmung zu iterieren. Ex: Für GET/spaceshuttles/46 Ich sollte einen Griff zu GET/spaceshuttles/get {id}

Ich brauche das für meine Web-App-Filter, wo einige URLs, die eine spezielle Behandlung erhalten. Momentan mache ich ein Match, indem ich gegen meine Liste iteriere. Ich gehe davon aus, dass es bereits eine Bibliothek geben muss, die das auf eine effiziente Weise tut.

Antwort

0

Ich habe keine Bibliothek im Hinterkopf, die Ihren Anforderungen entspricht. Ich würde für eine benutzerdefinierte Klasse geht RequestMatcher ein regexp Muster und eine Http-Methode oder String mit der Http Methode halten:

class RequestMatcher { 
    private Pattern urlPattern; 
    private String httpMethod; 

    public RequestMatcher(final String urlPattern, final String httpMethod) { 
     this.urlPattern = Pattern.compile(urlPattern); 
     this.httpMethod = httpMethod; 
    } 

    public boolean matches(final String url, final String httpMethod) { 
     return httpMethod.equals(this.httpMethod) && this.urlPattern.matcher(url).matches(); 
    } 

In Ihrem Filter Sie dann es wie folgt verwenden:

final RequestMatcher spaceShuttleMatcher = new RequestMatcher("/spaceshuttles/[0-9]+", "GET"); 
final RequestMatcher orderMatcher = new RequestMatcher("/[0-9]+\\.[0-9]+\\.[0-9]+/order", "POST"); 
boolean isSpaceShuttleRequest = spaceShuttleMatcher.matches("/spaceshuttles/123", "GET"); 
boolean isOrderMatcher = orderMatcher.matches("/1.2.3/order", "POST");