Restful调用使用泛型

通用返回类<使用泛型>

@Data
public class MyResult<T> 
{
	private String resultCode;
	
	private String resultMessage;
	
	private T resultData = null;

	public MyResult(T obj){
		resultMessage = "SUCCESS";
		resultCode = "0";
		resultData = obj;
	}
}

自定义RestTemplate

@Slf4j
public class ExtRestTemplate<T> extends RestTemplate {

	public static final int TIMEOUT_DEFAULT = 600000;

	public ExtRestTemplate(int timeoutInMilliseconds) {
		super();
		setTimeout(timeoutInMilliseconds);
	}
	
	private void setTimeout(int timeoutInMilliseconds) {
		SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
		requestFactory.setConnectTimeout(timeoutInMilliseconds);
		requestFactory.setReadTimeout(timeoutInMilliseconds);
		super.setRequestFactory(requestFactory);
	}

    static public <T> MyResult<T> postForMyResult(String url, Object obj, TypeReference<MyResult<T>> t) {
        return postForResult(url, obj, TIMEOUT_DEFAULT, t);
    }

    static public <T> MyResult<T> postForResult(String url, Object obj, int timeout, TypeReference<MyResult<T>> t) {

        ExtRestTemplate<T> restTemplate = new ExtRestTemplate<>(timeout);
        String resultStr = restTemplate.postForObject(url, obj, String.class);
        if(resultStr == null) {
            log.error("Result of postForObject is null. Perhapse url " + url + " is not exist.");
            return null;
        }
        MyResult<T> result = JSON.parseObject(resultStr, t);
        return result;
    }
}

调用

import com.alibaba.fastjson.TypeReference;

List<User> result = ExtRestTemplate.postForObject("http://localhost:8080/user/queryPost", new TypeReference<MyResult<List<User>>>() {});
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这是一个比较常见的应用场景。下面我简单介绍一下如何使用Java的Spring Boot框架创建RESTful风格的服务端,并创建对应的客户端程序。 ## 创建服务端 ### 1. 创建Spring Boot项目 首先,我们需要在IDE中创建一个Spring Boot项目。可以使用Maven或Gradle构建工具,这里以Maven为例。在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 数据库相关依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <scope>runtime</scope> </dependency> ``` 这里使用了Spring Boot内置的Web框架和H2数据库。如果需要使用其他Web框架或数据库,可以根据需要进行调整。 ### 2. 创建实体类和数据访问接口 在src/main/java目录下创建一个名为`com.example.demo`的包,并在该包下创建一个名为`Student`的实体类: ```java @Entity public class Student { @Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id; private String name; private String number; // 省略getter和setter方法 } ``` 这里使用了JPA注解来定义实体类和数据库表之间的映射关系。`@Id`注解表示该字段为主键,`@GeneratedValue`表示主键自动生成。 接下来,在同一个包下创建一个名为`StudentRepository`的接口: ```java public interface StudentRepository extends JpaRepository<Student, Long> { List<Student> findByName(String name); List<Student> findByNumber(String number); } ``` 这里使用了Spring Data JPA框架来访问数据库。`JpaRepository`是一个泛型接口,用于定义通用的CRUD操作。我们可以在该接口中定义自己的查询方法。 ### 3. 创建控制器 在同一个包下创建一个名为`StudentController`的控制器类: ```java @RestController @RequestMapping("/students") public class StudentController { private final StudentRepository studentRepository; public StudentController(StudentRepository studentRepository) { this.studentRepository = studentRepository; } @PostMapping("/") public Student create(@RequestBody Student student) { return studentRepository.save(student); } @GetMapping("/") public List<Student> getAll() { return studentRepository.findAll(); } @GetMapping("/name/{name}") public List<Student> getByName(@PathVariable String name) { return studentRepository.findByName(name); } @GetMapping("/number/{number}") public List<Student> getByNumber(@PathVariable String number) { return studentRepository.findByNumber(number); } } ``` 这里使用了`@RestController`注解来标识该类为控制器,并使用`@RequestMapping`注解来定义路由前缀。 `@PostMapping`注解表示该方法为处理POST请求的方法,`@RequestBody`注解表示该方法接收一个JSON格式的请求体,并将其转换为`Student`对象。 `@GetMapping`注解表示该方法为处理GET请求的方法,`@PathVariable`注解表示该方法接收一个路径参数。 ### 4. 配置数据库连接 在`application.properties`文件中添加以下配置: ``` spring.datasource.driverClassName=org.h2.Driver spring.datasource.url=jdbc:h2:mem:testdb spring.datasource.username=sa spring.datasource.password= spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.h2.console.enabled=true ``` 这里使用了H2内存数据库,并启用了H2控制台。 ### 5. 运行服务端 运行项目,访问`http://localhost:8080/h2-console`即可打开H2控制台。可以使用以下语句创建表并插入数据: ```sql CREATE TABLE student ( id BIGINT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255), number VARCHAR(255) ); INSERT INTO student (name, number) VALUES ('张三', '001'); INSERT INTO student (name, number) VALUES ('李四', '002'); INSERT INTO student (name, number) VALUES ('王五', '003'); ``` 然后,可以使用Postman等工具测试接口是否正常工作。 ## 创建客户端程序 ### 1. 添加依赖 在pom.xml文件中添加以下依赖: ```xml <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- JSON解析依赖 --> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> ``` 这里使用了Spring Boot内置的Web框架和Jackson库来处理JSON格式的数据。 ### 2. 创建实体类 在src/main/java目录下创建一个名为`com.example.demo`的包,并在该包下创建一个名为`Student`的实体类: ```java public class Student { private Long id; private String name; private String number; // 省略getter和setter方法 } ``` 这里与服务端的实体类相同。 ### 3. 创建客户端类 在同一个包下创建一个名为`StudentClient`的类: ```java public class StudentClient { private final RestTemplate restTemplate; private final String baseUrl; public StudentClient(RestTemplate restTemplate, String baseUrl) { this.restTemplate = restTemplate; this.baseUrl = baseUrl; } public List<Student> getAll() { String url = baseUrl + "/students/"; ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {}); return response.getBody(); } public List<Student> getByName(String name) { String url = baseUrl + "/students/name/" + name; ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {}); return response.getBody(); } public List<Student> getByNumber(String number) { String url = baseUrl + "/students/number/" + number; ResponseEntity<List<Student>> response = restTemplate.exchange(url, HttpMethod.GET, null, new ParameterizedTypeReference<List<Student>>() {}); return response.getBody(); } public Student create(Student student) { String url = baseUrl + "/students/"; return restTemplate.postForObject(url, student, Student.class); } } ``` 这里使用了`RestTemplate`来发送HTTP请求,并使用Jackson库来解析JSON格式的响应数据。需要注意的是,`exchange`方法用于处理返回类型为List的情况。 ### 4. 使用客户端类 在main方法中使用`StudentClient`类来调用服务端的接口: ```java @SpringBootApplication public class DemoApplication { public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); RestTemplate restTemplate = new RestTemplate(); String baseUrl = "http://localhost:8080"; StudentClient studentClient = new StudentClient(restTemplate, baseUrl); // 添加学生信息 Student student1 = new Student(); student1.setName("张三"); student1.setNumber("001"); studentClient.create(student1); Student student2 = new Student(); student2.setName("李四"); student2.setNumber("002"); studentClient.create(student2); Student student3 = new Student(); student3.setName("王五"); student3.setNumber("003"); studentClient.create(student3); // 获取所有学生信息 List<Student> students1 = studentClient.getAll(); System.out.println(students1); // 获取指定姓名的学生信息 List<Student> students2 = studentClient.getByName("张三"); System.out.println(students2); // 获取指定学号的学生信息 List<Student> students3 = studentClient.getByNumber("002"); System.out.println(students3); } } ``` 运行程序,即可测试客户端与服务端的交互是否正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值