2016-07-19 21 views
0

Ich entwickle eine REST-API Restlet.Restlet URL/Pfad Muster mismapping

Bisher wurde alles funktioniert ganz gut. Allerdings traf ich jetzt ein Problem mit der Router Zuordnung von URL zu ServerResource.

Ich habe das folgende Szenario bekam:

  • GET /car gibt eine Liste aller Autos
  • GET /car/{id} werden Details über das Auto mit der ID 1
  • /car/advancedsearch?param1=test GET sollte eine Suche über alle laufen Autos mit einigen Parametern

Die ersten beiden Anrufe funktionieren ohne Probleme. Wenn ich jedoch versuche, den dritten Anruf zu starten, wird das Restlet Router dem zweiten zugeordnet. Wie kann ich Restlet mitteilen, stattdessen den dritten Fall zu verwenden?

Meine Zuordnung ist wie folgt definiert:

router.attach("/car",    CarListResource.class); 
router.attach("/car/{id}",   CarResource.class); 
router.attach("/car/advancedsearch", CarSearchResource.class); 

CarSearchResource nie aufgerufen wird, sondern die Anforderung wird in CarResource auf.

Der standardmäßige Anpassungsmodus des Routers ist auf Template.MODE_EQUALS eingestellt, sodass er nicht verursacht werden kann.

Hat jemand weitere Vorschläge, wie ich es beheben könnte?


Bitte schlagen nicht /car mit den Parametern, anstatt zu verwenden, da es bereits eine andere Art der Suche an seinem Platz auf diesem Niveau. Außerdem habe ich nicht die Kontrolle über die API-Struktur, also muss sie so bleiben wie sie ist.

Antwort

0

ich in der Lage war, dies zu lösen, indem sie einfach Neuordnen der attach Aussagen:

router.attach("/car/advancedsearch", CarSearchResource.class); 
router.attach("/car",    CarListResource.class); 
router.attach("/car/{id}",   CarResource.class); 
0

müssen Sie .setMatchingQuery(true); zu diesem Router hinzufügen, um es zu erkennen, dass es mit einer Abfrage am Ende davon ist.

Router router = (Router) super.createInboundRoot(); 
    TemplateRoute route1 = router.attach("/car/advancedsearch?{query_params}", MyResource.class); 
    route1.setMatchingQuery(true); 
    return router; 

Kenntnis, dass sich dieses Muster mit der genauen bestimmten Reihenfolge ist, dass Sie in der Route festgestellt haben, dh advancedsearch zuerst kommt und query_params kommt nach

+0

Ich musste das nicht für den Haupt '/ car' Pfad tun, und dieser benutzt Parameter auch. Außerdem muss es '/ car/advancedsearch', nicht'/advancedsearch' sein. – Baz

+0

Ich habe das jetzt auch versucht, aber das Ergebnis ist das gleiche. – Baz

+0

es ist nur für Abfrageform – Igor