Spring RestTemplate提供了一种测试RESTful Web服务的便捷方式。
目录[ 隐藏 ]
spring-web
Spring 3中引入的一部分。让我们看一下Spring RestTemplate示例,我们将测试在Spring Data JPA文章中创建的REST Web服务。下表说明了此休息Web服务支持的URI。
URI | HTTP方法 | 描述 |
---|---|---|
/ springData /人 | 得到 | 从数据库中获取所有人员 |
/ springData /人/(编号) | 得到 | 通过id获取人物 |
/ springData /人 | POST | 将人员添加到数据库 |
/ springData /人 | 放 | 更新人 |
/ springData /人/(编号) | 删除 | 按ID删除人员 |
让我们开始创建我们的Rest客户端项目来测试这些Web服务。
下图显示了我们最终的Spring RestTemplate示例项目。
我们需要spring-core
,spring-context
对于依赖Spring框架。然后我们需要spring-web
包含RestTemplate
类的人工制品。我们还需要jackson-mapper-asl
对春JSON通过支持杰克逊 API。
xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0modelVersion>
<groupId>com.journaldev.springgroupId>
<artifactId>SpringRestTemplateartifactId>
<version>1.0-SNAPSHOTversion>
<properties>
<spring.framework>4.3.0.RELEASEspring.framework>
<spring.web>3.0.2.RELEASEspring.web>
<serializer.version>2.8.1serializer.version>
properties>
<dependencies>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-coreartifactId>
<version>${spring.framework}version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-contextartifactId>
<version>${spring.framework}version>
dependency>
<dependency>
<groupId>org.codehaus.jacksongroupId>
<artifactId>jackson-mapper-aslartifactId>
<version>1.9.4version>
dependency>
<dependency>
<groupId>org.springframeworkgroupId>
<artifactId>spring-webartifactId>
<version>${spring.web}version>
dependency>
dependencies>
project>
我们必须为RestTemplate类定义一个spring bean,这是在AppConfig
类中完成的。
package com.journaldev.spring.config;
import org.codehaus.jackson.map.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.json.MappingJacksonHttpMessageConverter;
import org.springframework.web.client.RestTemplate;
@Configuration
@ComponentScan("com.journaldev.spring")
public class AppConfig {
@Bean
RestTemplate restTemplate() {
RestTemplate restTemplate = new RestTemplate();
MappingJacksonHttpMessageConverter converter = new MappingJacksonHttpMessageConverter();
converter.setObjectMapper(new ObjectMapper());
restTemplate.getMessageConverters().add(converter);
return restTemplate;
}
}
请注意,RestTamplate使用MessageConverter,我们需要在RestTemplate bean中设置此属性。在我们的示例中,我们MappingJacksonHttpMessageConverter
用于从JSON格式获取数据。
由于我们尝试使用jackson mapper将我们的Web服务返回的JSON转换为java对象,因此我们必须为此创建模型类。请注意,此模型类与Web服务中使用的模型类非常相似,只是在这里我们不需要JPA注释。
package com.journaldev.spring.model;
public class Person {
private Long id;
private Integer age;
private String firstName;
private String lastName;
public Person() {
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
@Override
public String toString() {
return "Person{" + "id=" + id + ", age=" + age + ", firstName='" + firstName + '\'' + ", lastName='" + lastName
+ '\'' + '}';
}
}
最后一步是创建将使用上面定义的RestTemplate bean的客户端类。
package com.journaldev.spring.config;
import java.util.List;
import org.springframework.http.HttpStatus;
import com.journaldev.spring.model.Person;
public interface PersonClient {
List getAllPerson();
Person getById(Long id);
HttpStatus addPerson(Person person);
void updatePerson(Person person);
void deletePerson(Long id);
}
package com.journaldev.spring.config;
import java.util.Arrays;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;
import com.journaldev.spring.model.Person;
@Service
public class PersonClientImpl implements PersonClient {
@Autowired
RestTemplate restTemplate;
final String ROOT_URI = "http://localhost:8080/springData/person";
public List getAllPerson() {
ResponseEntity response = restTemplate.getForEntity(ROOT_URI, Person[].class);
return Arrays.asList(response.getBody());
}
public Person getById(Long id) {
ResponseEntity response = restTemplate.getForEntity(ROOT_URI + "/"+id, Person.class);
return response.getBody();
}
public HttpStatus addPerson(Person person) {
ResponseEntity response = restTemplate.postForEntity(ROOT_URI, person, HttpStatus.class);
return response.getBody();
}
public void updatePerson(Person person) {
restTemplate.put(ROOT_URI, person);
}
public void deletePerson(Long id) {
restTemplate.delete(ROOT_URI + id);
}
}
代码是自我理解的,我们基于URI和HTTP方法调用RestTemplate方法,并在需要时传递适当的请求对象。
是时候测试我们的Spring RestTemplate示例项目了,下面的类展示了如何在Spring方式中使用RestTemplate方法。
package com.journaldev.spring;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.http.HttpStatus;
import com.journaldev.spring.config.AppConfig;
import com.journaldev.spring.config.PersonClient;
import com.journaldev.spring.model.Person;
public class Main {
public static void main(String[] args) {
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
PersonClient client = applicationContext.getBean(PersonClient.class);
System.out.println("Getting list of all people:");
for (Person p : client.getAllPerson()) {
System.out.println(p);
}
System.out.println("\nGetting person with ID 2");
Person personById = client.getById(2L);
System.out.println(personById);
System.out.println("Adding a Person");
Person p = new Person();
p.setAge(50);
p.setFirstName("David");
p.setLastName("Blain");
HttpStatus status = client.addPerson(p);
System.out.println("Add Person Response = " + status);
applicationContext.close();
}
}
当我针对我的本地设置运行上面的程序时,我得到以下输出。
Getting list of all people:
Person{id=2, age=30, firstName='Oksi', lastName=' Bahatskaya'}
Person{id=1, age=30, firstName='Vlad', lastName='Mateo'}
Getting person with ID 2
Person{id=2, age=30, firstName='Oksi', lastName=' Bahatskaya'}
Adding a Person
Add Person Response = 201
下图显示了执行上述程序之前和之后的Web服务数据库表数据。
如您所见,程序输出与样本表数据匹配。这就是Spring RestTemplate示例,您可以从下面的链接下载项目。
下载Spring RestTemplate示例项目
参考:API Doc