Ich versuche zu verstehen, wie man Links in Spring HATEOAS erstellt und ändert.Wie Sie Links mit Spring HATEOAS setzen und posten
Zum Beispiel, sagen wir, ich habe zwei Sammlungen, eine bei api/users und eine andere bei api/event. Ich möchte einen Benutzer api/user/56 mit einem Ereignis api/event/21 verknüpfen. Aus Gründen der Argumentation ist dies ein Viele-zu-Viele - ein Benutzer kann an vielen Ereignissen teilnehmen, ein Ereignis kann viele Benutzer haben.
Wie ich es verstehe, ist die beruhigende Art, dies zu tun, die URIs als Primärschlüssel zu verwenden, also könnte ich das Folgende an api/user/56/events posten;
{
attends: "http://localhost:9090/api/event/21"
}
Der Endpunkt muss dann in der Lage sein, die URL zu analysieren und zu extrahieren, die ID (in diesem Fall 21) und die Steuerung (EventController.class), so dass ich das persistieren kann.
Frage 1: Ist dies der richtige Umgang mit Beziehungen in Spring Hateoas in Bezug auf die REST-API?
Frage 2: Wie kann ich diese URL in einem Controller zu einem brauchbaren Griff auf den Daten (zum Beispiel einen Verweis auf die entsprechenden Controller/Methode, einen Primärschlüssel usw.)
Forschung
lösenRestTemplate kann verwendet werden, um die Daten vom Controller innerhalb der request-mapped-Methode abzufragen.
RestTemplate restTemplate = new RestTemplate();
ResponseEntity<EventResource> response = restTemplate.getForEntity(attendsUrl, EventResource.class);
EventResource eventResource = response.getBody();
Allerdings glaube ich nicht, dass eventResource ein ID-Feld als Teil der Daten zurückgeben sollte - es ist nicht sehr ruhig ist und dies würde auf der API ausgesetzt werden. Ein Ansatz ist es, einen Parameter "includePK = true" zu haben, aber auch das fühlt sich nicht richtig an - es versteckt nur das Problem. Außerdem scheint die Idee, dass der Server auf diese Weise Anfragen an seine eigene API stellt, umständlich.
aktualisieren
Es ist eine offene Frage für diese hier https://github.com/spring-projects/spring-hateoas/issues/292. Basierend auf einigen der Kommentare (von Benutzer kevinconaway) aus diesem Problem habe ich eine schnelle Util-Klasse, die hier eine einfache Lösung bietet: SpringHateoasUtils. Die Lösung läuft darauf hinaus;
String mapping = DISCOVERER.getMapping(targetClass, targetMethod);
UriTemplate template = new UriTemplate(mapping);
//values is key/value map of parameters that the referenced method accepts
Map<String, String> values = uriTemplate.match(uri);
SpringHateoasUtils macht dies etwas schöner, aber es fühlt sich immer noch wie ein Merkmal sein sollte. Ich werde versuchen, etwas in den Frühlingscode dafür zu bekommen - wenn es klar ist, was damit passiert, werde ich diese Frage beantworten.
Sie würden schreiben 'http: // localhost: 9090/api/event/21' nur. Spring HATEOAS hilft Ihnen nicht, eine URL zu dereferenzieren.Es ist nur für Antworten gedacht, nicht für Anfragen. Sie können sich vielleicht [Spring Data REST] (http://projects.spring.io/spring-data-rest/) ansehen. – zeroflagL
Nachdem ich mehrere Monate mit Spring HATEOAS gearbeitet habe, scheint es REST nicht richtig zu unterstützen, also ich mussten ähnliche Umgehungslösungen zu dem implementieren, was Sie beschreiben. –