Routing basierend auf Abfrageparameter im Play-Framework

8

Meine Webanwendung wird von einem externen System ausgelöst. Es ruft einen Anfragepfad meiner App auf, verwendet jedoch verschiedene Abfrageparameter für verschiedene Arten von Anfragen.

Einer der Parameter ist die "Aktion", die definiert, was zu tun ist. Der Rest der Parameter hängt von der "Aktion" ab.

So kann ich Request-Parameter wie diese erhalten:

%Vor%

Ich würde gerne in der Lage sein, es ähnlich in der routes-Datei für play zu codieren, so dass es das query-param-basierte Routing und so viel von der Validierung anderer Parameter wie möglich macht.

Was ich stattdessen habe, ist ein Routing für all diese Möglichkeiten mit vielen optionalen Parametern. Die Aktion, die es verarbeitet, beginnt mit einer großen Musterübereinstimmung, um die Verteilung und Parameterüberprüfung durchzuführen.

Googeln und Überprüfen von SO hat gerade viele Samples aufgetaucht, wo die Params irgendwie im Request-Pfad kodiert sind, also werden mehrere Pfade zur gleichen Aktion geroutet, aber ich möchte das Gegenteil: ein Pfad zu verschiedenen Aktionen geroutet.

Einer meiner Kollegen sagte, wir könnten eine "Dispatcher" -Aktion haben, die basierend auf dem "action" -Parameter umleiten würde. Es wäre etwas strukturierter als die aktuelle Lösung, aber es würde nicht die lange Liste von optionalen Parametern eliminieren, die selektiv an die nächste Aktion weitergegeben werden sollte, so dass ich hoffe, dass man eine noch bessere Lösung kennt: -)

Übrigens, das externe System, das meine App aufruft, wird von einem anderen Unternehmen entwickelt, und ich habe keinen Einfluss auf dieses Design. Daher ist es keine Option, die Art und Weise zu ändern, wie meine App ausgelöst wird.

    
Sandor Murakozi 28.03.2013, 14:46
quelle

2 Antworten

6

Die Single-Dispatcher-Aktion ist wahrscheinlich der richtige Weg, und Sie müssen nicht alle optionalen Parameter in der Route angeben. Wenn action immer da ist, dann ist das die einzige, die Sie wirklich brauchen.

%Vor%

Dann können Sie in Ihrer Aktionsmethode auf request.queryString zugreifen, um einen der anderen optionalen Parameter zu erhalten.

    
estmatic 28.03.2013, 17:13
quelle
3

Hinweis: Ich bin NICHT erfahrener Scala-Entwickler, daher können eventuell präsentierte Snippets optimiert werden ... Was für Sie wichtig ist, sind sie gültig und funktionieren.

Also ...

Sie müssen nicht jeden optionalen Parameter in der Datei routes deklarieren. Es ist eine großartige Abkürzung für die Validierung des Typs param und die beste Wahl wäre, andere Unternehmen zu überzeugen, die API zu verwenden, die von Ihnen vorbereitet wurde. Wenn Sie keine solche Möglichkeit haben, können Sie auch ihre Anfragen nach Bedarf.

Im Allgemeinen: der Dispatcher Ansatz scheint an dieser Stelle richtig zu sein, zum Glück müssen Sie nicht alle optionalen Parameter in der routes deklarieren und sie zwischen Aktionen / Methoden weitergeben, wie sie können direkt aus Anfrage abgeholt werden. In PHP kann es mit $_GET['action'] verglichen werden und in der Java Version von Play 2 Controller - DynamicForm class - form().bindFromRequest.get("action") .

Nehmen wir an, Sie haben eine Route:

%Vor%

In diesem Fall kann Ihre Dispatcher-Aktion (und zusätzliche Methoden) wie folgt aussehen:

%Vor%

Natürlich müssen Sie eingehende Typen und Werte "manuell" validieren, besonders wenn Aktionen auf der Datenbank ausgeführt werden, egal wie groß der Teil Ihres Problems ist, den Sie jetzt gelöst haben.

    
biesior 28.03.2013 17:38
quelle

Tags und Links