Java 使用spring hateoas使用基于HAL的REST服务
我正在尝试使用RestTemplate类使用基于HAL的REST服务。 响应主体如下所示:Java 使用spring hateoas使用基于HAL的REST服务,java,spring,rest,spring-hateoas,Java,Spring,Rest,Spring Hateoas,我正在尝试使用RestTemplate类使用基于HAL的REST服务。 响应主体如下所示: { "_embedded": { "school:teachers": [ { "name": "Adams", "state": "CA", "_links": { "self": { "href": "http://localhost:8080/api/teachers/1"
{
"_embedded": {
"school:teachers": [
{
"name": "Adams",
"state": "CA",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/1"
}
}
},
{
"name": "Barnes",
"state": "FL",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/2"
}
}
},
{
"name": "Armstrong",
"state": "GA",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/3"
}
}
}
]
},
"_links": {
"curies": [
{
"href": "http://localhost:8080/docs/html5/{rel}.html",
"name": "school",
"templated": true
}
]
}
}
public class Teacher {
private String name;
private String state;
// getters and setters...
}
...
RestTemplate restTemplate = new RestTemplate();
Map<String, Object> dummy = new HashMap<>();
HttpEntity<String> httpEntity = getHttpEntity();
ResponseEntity<Resources<Resource<Teacher>>> response = restTemplate.exchange(url,
HttpMethod.GET,
httpEntity,
new ParameterizedTypeReference<Resources<Resource<Teacher>>>() {});
Resources<Resource<Teacher>> resources = response.getBody();
...
教师
课程如下所示:
{
"_embedded": {
"school:teachers": [
{
"name": "Adams",
"state": "CA",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/1"
}
}
},
{
"name": "Barnes",
"state": "FL",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/2"
}
}
},
{
"name": "Armstrong",
"state": "GA",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/3"
}
}
}
]
},
"_links": {
"curies": [
{
"href": "http://localhost:8080/docs/html5/{rel}.html",
"name": "school",
"templated": true
}
]
}
}
public class Teacher {
private String name;
private String state;
// getters and setters...
}
...
RestTemplate restTemplate = new RestTemplate();
Map<String, Object> dummy = new HashMap<>();
HttpEntity<String> httpEntity = getHttpEntity();
ResponseEntity<Resources<Resource<Teacher>>> response = restTemplate.exchange(url,
HttpMethod.GET,
httpEntity,
new ParameterizedTypeReference<Resources<Resource<Teacher>>>() {});
Resources<Resource<Teacher>> resources = response.getBody();
...
GET方法的REST服务的返回类型为ResponseEntity
。因此,我在客户端代码中的请求如下所示:
{
"_embedded": {
"school:teachers": [
{
"name": "Adams",
"state": "CA",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/1"
}
}
},
{
"name": "Barnes",
"state": "FL",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/2"
}
}
},
{
"name": "Armstrong",
"state": "GA",
"_links": {
"self": {
"href": "http://localhost:8080/api/teachers/3"
}
}
}
]
},
"_links": {
"curies": [
{
"href": "http://localhost:8080/docs/html5/{rel}.html",
"name": "school",
"templated": true
}
]
}
}
public class Teacher {
private String name;
private String state;
// getters and setters...
}
...
RestTemplate restTemplate = new RestTemplate();
Map<String, Object> dummy = new HashMap<>();
HttpEntity<String> httpEntity = getHttpEntity();
ResponseEntity<Resources<Resource<Teacher>>> response = restTemplate.exchange(url,
HttpMethod.GET,
httpEntity,
new ParameterizedTypeReference<Resources<Resource<Teacher>>>() {});
Resources<Resource<Teacher>> resources = response.getBody();
...
。。。
RestTemplate RestTemplate=新RestTemplate();
Map dummy=newhashmap();
HttpEntity HttpEntity=getHttpEntity();
ResponseEntity response=restemplate.exchange(url,
HttpMethod.GET,
httpEntity,
新的ParameteredTypeReference(){});
Resources=response.getBody();
...
当我使用响应类型ParameterizedTypeReference
发出请求时,响应的内容为空。当我使用String
时,我检索内容列表
我应该如何使用响应类型
ParameterizedTypeReference
来请求检索它以直接在POJO中映射它?当然,您应该使用Traverson
Traverson client = new Traverson(new URI("http://localhost:8080/api/"),
MediaTypes.HAL_JSON);
Resources<Resource<Teacher>> teachers = client
.follow("school:teachers")
.toObject(new ResourcesType<Resource<Teacher>>(){});
Traverson客户端=新的Traverson(新的URI(“http://localhost:8080/api/"),
MediaTypes.HAL_JSON);
资源教师=客户
.follow(“学校:教师”)
.toObject(新的ResourcesType(){});
我也面临类似的问题。我选择的解决方法是:
ResponseEntity<String> response = restTemplate.exchange(
"http://localhost:8080/payment/search/findByApprovalDate?approvalDate=2017-11-06", HttpMethod.GET,
null, String.class);
String data = response.getBody();
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNode jsNode = om.readTree(data);
String test = jsNode.at("/_embedded/payment").toString();
payments = om.readValue(test, new TypeReference<List<RHPayment>>() {
});
ResponseEntity response=restemplate.exchange(
"http://localhost:8080/payment/search/findByApprovalDate?approvalDate=2017-11-06“,HttpMethod.GET,
null,String.class);
字符串数据=response.getBody();
ObjectMapper om=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
JsonNode jsNode=om.readTree(数据);
String test=jsNode.at(“/_embedded/payment”).toString();
payments=om.readValue(测试,新类型引用(){
});
我使用JAVA使用JSON+HAL资源。与中所示的RestTemplate相比,该库大大简化了资源消耗。我尝试了与Vishnoo Rath类似的方法。我计划为我所有的资源建立一个通用的方法
ResponseEntity<String> response =
restTemplate.exchange("http://localhost:8081/rest/cars", HttpMethod.GET, null, String.class);
String data = response.getBody();
//log.info(data);
ObjectMapper om = new ObjectMapper();
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
JsonNode jsNode = om.readTree(data);
String test = jsNode.at("/_embedded/cars").toString();
//log.info(test);
ArrayList<Car> cars = om.readValue(test, new TypeReference<List<Car>>() {
});
for (Car theCar : cars) {
log.info(">>> " + theCar.getMake() + " " + theCar.getModel() + " " + theCar.getYear());
}
ResponseEntity响应=
restTemplate.exchange(“http://localhost:8081/rest/cars,HttpMethod.GET,null,String.class);
字符串数据=response.getBody();
//日志信息(数据);
ObjectMapper om=新的ObjectMapper();
configure(在未知属性上反序列化feature.FAIL,false);
JsonNode jsNode=om.readTree(数据);
String test=jsNode.at(“/_embedded/cars”).toString();
//日志信息(测试);
ArrayList cars=om.readValue(测试,新类型引用(){
});
汽车(汽车:汽车){
log.info(“>>>>”+theCar.getMake()+“”+theCar.getModel()+“”+theCar.getYear());
}
您的服务返回资源
似乎非常可疑。如果你控制代码,考虑改变它。也就是说,您必须在客户端使用restemplate
?如果不是,则是更好的选择,因为它是为导航HAL响应而构建的,而RestTemplate
不是。@AbhijitSarkar我不控制服务器端代码,因此我必须使用它。我从未听说过Traverson,我必须看看如何发出请求。@AbhijitSarkar资源有什么问题?@AbhijitSarkar必须问同样的问题-该响应类型有什么问题?这既合法又普遍。特别是你为什么认为这很重要。当然,问题在于使用JSON?因此,服务器上的响应“type”不重要。请在回答中添加相关代码和说明,而不是链接到外部URL。