2014-10-09 9 views
7

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ösen

RestTemplate 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.

+0

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

+0

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. –

Antwort

1

Schauen Sie sich die Antwort hier:

POSTing a @OneToMany sub-resource association in Spring Data REST

Frage 1) Ja, das ist, wie Sie Links/Beziehungen schreiben. Mit URIs.

Frage 2) Der URI der Ressource tatsächlich IST seine ID aus der Sicht des Clients. Der Server intern löst automatisch diese URI in die eigentliche Modellinstanz mit

org.springframework.data.rest.core.UriToEntityConverter.convert(...)

+0

Dies ist eine Frage zu Spring Hateoas - obwohl Spring Data Rest eine eingeschränkte Verwendung von Links zulässt, bietet Spring Data Rest keine Möglichkeit, eigene Link-Handling-Funktionen zu implementieren. –

+0

Hallo Andrew! Hast du den Link gesehen, den ich gepostet habe? Ich brauchte auch eine Weile, um die feinen Unterschiede zu verstehen. Aber in der Zwischenzeit habe ich herausgefunden, wie man archiviert, was man versucht zu tun: Spring Data HATEOAS erlaubt es, Links zwischen Entitäten zu erstellen, indem man eine Text/Uri-Liste, z. so: 'curl -X PUT -H" ContentType: Text/URL-Liste "http: // localhost: 8080/api/myEntity/1' mit dem Link uri als Payload' http: // localhost: 8080/api/myLinkedChildEntity/4711' Wenn Sie mehr Low-Level-Zugriff benötigen, können Sie jederzeit Ihren eigenen @RestController im Spring Rest implementieren – Robert