2014-10-09 67 views
7

我想了解如何創建和修改鏈接在春天HATEOAS。如何把和鏈接與春天HATEOAS

例如,假設我有兩個集合,一個在api/users和另一個在api/event。我想將用戶api/user/56與事件api/event/21相關聯。出於參數的緣故,這是多對多的 - 用戶可能參加很多活動,一個活動可能會有很多用戶。根據我的理解,這樣做的方法是使用URI作爲主鍵,所以我可能會將以下內容發佈到api/user/56/events;

{ 
    attends: "http://localhost:9090/api/event/21" 
} 

然後,端點需要能夠解析該URL,並提取ID(在此情況下21)和所述控制器(EventController.class),這樣我可以保持此。

問題1:這是用REST API處理Spring Hateoas中關係的正確方法嗎?

問題2:如何解決這個URL在一個控制器上的數據可使用的手柄(例如,以適當的控制器/方法,主鍵等的引用)

研究

RestTemplate可用於在請求映射方法內請求來自控制器的數據,就像這樣;

RestTemplate restTemplate = new RestTemplate(); 
ResponseEntity<EventResource> response = restTemplate.getForEntity(attendsUrl, EventResource.class); 
EventResource eventResource = response.getBody(); 

不過,我不認爲eventResource應該返回一個ID字段作爲數據的一部分 - 它不是很寧靜,這將在API暴露。一種方法是有一個參數「includePK = true」,但是這又不恰當 - 它只是隱藏了問題。此外,服務器以這種方式向自己的API請求的想法似乎是迂迴的。

更新

有這個這裏https://github.com/spring-projects/spring-hateoas/issues/292一個懸而未決的問題。基於這個問題的一些評論(用戶kevinconaway),我做了一個快速的util類,在這裏提供了一個簡單的解決方案:SpringHateoasUtils。解決方案歸結爲;

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使這個稍微好一些,但它仍然覺得它應該是一個功能。我會尋求在春季代碼中獲得一些東西 - 當清楚發生了什麼時,我會回答這個問題。

+0

您會後通過'http://本地主機:9090/API /事件/ 21'只。 Spring HATEOAS不會幫助您取消引用URL。這只是爲了迴應,而不是要求。你可能會看看[Spring Data REST](http://projects.spring.io/spring-data-rest/) – zeroflagL 2014-10-13 11:18:03

+0

與Spring HATEOAS一起工作了好幾個月,它肯定不會正確支持REST,所以我必須實施類似的解決方法來描述您所描述的內容。 – 2017-01-23 20:43:32

回答

1

看看這裏的答案:

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

問題1)是的,這是你如何發佈鏈接/關係。使用URI。

問題2)從客戶的角度來看,資源的URI實際上是IS。服務器在內部自動解析這個URI到實際的模型實例與

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

+0

這是一個關於Spring Hateoas的問題 - 雖然Spring Data Rest允許有限地使用鏈接,但Spring Data Rest沒有提供實現鏈接處理功能的方法。 – 2017-01-30 22:52:13

+0

你好安德魯!你看過我發佈的鏈接了嗎?這也讓我花了一段時間來了解細微的差異。但同時我發現瞭如何將你想要做的事情歸檔:Spring Data HATEOAS允許通過發佈文本/ URI列表來「創建」實體之間的鏈接。像這樣:'curl -X PUT -H「ContentType:text/uri-list」http:// localhost:8080/api/myEntitty/1「,鏈接uri作爲有效載荷」http:// localhost:8080/api/myLinkedChildEntity/4711'如果你需要更多的低級訪問,你可以在spring rest中實現你自己的@RestController – Robert 2017-02-01 14:54:06