2014-10-09 2 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" 
} 

엔드 포인트는이 I를 유지할 수 있도록 상기 제어기 (EventController.class) (여기서는 21)에 ID를 그 URL을 파싱하고 추출 할 수 있어야한다.

질문 1 : Spring Hateoas에서 REST API의 관계를 다루는 올바른 방법입니까?

질문 2 : I (예를 들어 해당 컨트롤러/방법, 기본 키 등 참조) 데이터에 사용 가능한 핸들

연구

을 컨트롤러에서이 URL을 해결할 수있는 방법

RestTemplate은 요청 된 매핑 된 메소드 내부의 컨트롤러에서 데이터를 요청하는 데 사용할 수 있습니다. 아주 편안한 아니라이는 API에 노출 될 수 -

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

그러나 나는 eventResource 데이터의 일환으로 ID 필드를 반환해야한다고 생각하지 않습니다. 한 가지 방법은 매개 변수 "includePK = true"를 사용하는 것입니다.하지만 다시는 이것이 적절하지 않다고 생각합니다. 단지 문제를 숨기는 것입니다. 게다가이 방식으로 서버가 자신의 API를 요청한다는 생각은 순조롭게 보입니다.

업데이트

이 여기 https://github.com/spring-projects/spring-hateoas/issues/292에 대한 의문이있다. 느슨하게 일부 의견 (사용자에 의해 kevinconaway) 그 문제에서 나는 여기에 쉬운 해결책을 제공하는 빠른 유틸리티 클래스를 만들었습니다 : 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

와 실제 모델 인스턴스에이 URI를 해결'에 http : // localhost를 : 9090/API/이벤트/21' 만. HATEOAS은 URL을 역 참조하는 것을 돕지 않습니다.응답에만 사용되며 요청에는 사용되지 않습니다. [Spring Data REST] (http://projects.spring.io/spring-data-rest/) – zeroflagL

+0

Spring HATEOAS를 몇 달 동안 사용해 본 결과, REST를 올바르게 지원하지 않는 것으로 보입니다. 설명하는 것과 유사한 해결 방법을 구현해야했습니다. –

답변

1

봐 : 당신이 링크/관계를 게시하는 방법 1

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

질문) 예입니다. URI와.

질문 2) 실제로 리소스의 URI는 입니다.은 클라이언트의 관점에서 볼 때 ID입니다. 서버는 내부적으로 자동 게시 할

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

+0

이것은 Spring Hateoas에 대한 질문입니다. Spring Data Rest는 링크를 제한적으로 사용할 수 있지만 Spring Data Rest는 자체 링크 처리 기능을 구현하는 방법을 제공하지 못합니다. –

+0

안녕하세요 앤드류! 제가 게시 한 링크를 보셨습니까? 미묘한 차이점을 이해하는데도 시간이 걸렸습니다. 그러나 한편으로 나는 당신이하려는 것을 아카이브하는 방법을 발견했다 : Spring Data HATEOAS는 text/uri-list를 게시함으로써 엔티티들 사이의 링크를 "생성"할 수있다. 'curl -X PUT -H "ContentType : uri를 페이로드로 사용하여 http : // localhost : 8080/api/myEntitty/1"http : // localhost : 8080/myLinkedChildEntity/4711' 저수준 접근이 더 필요하다면, 스프링 휴식에서 자신 만의 @RestController를 구현할 수 있습니다 – Robert