在日常项目开发中,有时候我们需要调用第三方接口数据,常用的方法有传统JDK自带的URLConnection,Apache Jakarta Common下的子项目HttpClient ,Spring的RestTemplate。
spring框架提供的RestTemplate类可用于在应用中调用rest服务,它简化了与http服务的通信方式,统一了RESTful的标准,封装了http链接, 我们只需要传入url及返回值类型即可。相较于之前常用的HttpClient,RestTemplate是一种更优雅的调用RESTful服务的方式。
在Spring应用程序中访问第三方REST服务与使用Spring RestTemplate类有关。RestTemplate类的设计原则与许多其他Spring *模板类(例如JdbcTemplate、JmsTemplate)相同,为执行复杂任务提供了一种具有默认行为的简化方法。
RestTemplate默认依赖JDK提供http连接的能力(HttpURLConnection),如果有需要的话也可以通过setRequestFactory方法替换为例如 Apache HttpComponents、Netty或OkHttp等其它HTTP library。
考虑到RestTemplate类是为调用REST服务而设计的,因此它的主要方法与REST的基础紧密相连就不足为奇了,后者是HTTP协议的方法:HEAD、GET、POST、PUT、DELETE和OPTIONS。例如,RestTemplate类具有headForHeaders()、getForObject()、postForObject()、put()和delete()等方法。
项目目录:
实体对象用于创建数据库用
package com.example.resttemplatedemo.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
public class User {
@Id
@GeneratedValue
private Long id;//id类型要为Long,java的包装长整型类
private String userName;
private String password;
public User() {
}
public User(String userName, String password) {
this.userName = userName;
this.password = password;
}
public User(Long id,String userName, String password) {
this.id = id;
this.userName = userName;
this.password = password;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"userName='" + userName + '\'' +
", password='" + password + '\'' +
'}';
}
}
数据访问
package com.example.resttemplatedemo.domain;
import org.springframework.data.jpa.repository.JpaRepository;
import java.util.List;
public interface UserRepository extends JpaRepository<User,Long> {
List<User> findByUserName(String userName);
List<User> findByUserNameAndPassword(String userName,String password);
}
业务逻辑service
package com.example.resttemplatedemo.service;
import com.example.resttemplatedemo.domain.User;
import com.example.resttemplatedemo.domain.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserRepository userRepository;
/**
* 查询所有的用户名单列表
* @return
*/
public List<User> findAll(){
return userRepository.findAll();
}
/**
* 增加/修改一个用户表单信息
* 增加与修改的区别就是id是否为空,id为空是增加,id不为空是修改
* @param user
* @return
*/
public User save(User user) {
return userRepository.save(user);
}
/**
* 通过id获取一条用户信息信息
* @param id
* @return
*/
public User findone(long id) {
return userRepository.findById(id).get();
}
public void delete(long id){
userRepository.deleteById(id);
}
/**
* 自定义查询
* @param userName
* @param password
* @return
*/
public List<User> findByUserNameAndPassword(String userName,String password){
return userRepository.findByUserNameAndPassword(userName,password);
}
public List<User> findByUserName(String userName){
return userRepository.findByUserName(userName);
}
}
web层
package com.example.resttemplatedemo.web;
import com.example.resttemplatedemo.domain.User;
import com.example.resttemplatedemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
public class UserApp {
@Autowired
private UserService userService;
/**
*查询所有的用户名单列表
* @return
*/
@GetMapping("/user")
public List<User> getAll(){
return userService.findAll();
}
/**
*增加一个用户表单信息
*增加与修改的区别就是id是否为空,id为空是增加,id不为空是修改
* @param user
* @return
*/
@PostMapping("/user")
public User post(@RequestBody User user){
return userService.save(user);
}
// public User post(User user){
//
// return userService.save(user);
// }
/**
*修改一个用户表单信息
*增加与修改的区别就是id是否为空,id为空是增加,id不为空是修改
* @param user
* @return
*/
@PutMapping("/user")
public User update(@RequestBody User user){
return userService.save(user);
}
// public User update(@RequestParam Long id,
// @RequestParam String userName,
// @RequestParam String password){
// User user = new User();
// user.setId(id);
// user.setUserName(userName);
// user.setPassword(password);
// return userService.save(user);
// }
/**
* 根据id获取一条用户信息
* @param id
* @return
*/
@GetMapping("/user/{id}")
public User getone(@PathVariable Long id){
return userService.findone(id);
}
/**
* 根据id删除一条用户信息
* @param id
*/
@DeleteMapping("/user/{id}")
public void deletOne(@PathVariable Long id){
userService.delete(id);
}
@PostMapping("/findBy")
public List<User> findBy( String userName,String password){
//return userService.findByUserNameAndPassword(userName,password);
return userService.findByUserName(userName);
}
}
Test
package com.example.resttemplatedemo;
import com.example.resttemplatedemo.domain.User;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.client.RestTemplate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@SpringBootTest
public class RestTemplateTest {
// 最新api地址:https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/client/RestTemplate.html
/**
* Get 无参
*/
@Test
public void getTest(){
//建议以注入方式使用
RestTemplate restTemplate=new RestTemplate();
String result = restTemplate.getForObject("http://localhost:8080/getNoParam", String.class);
//restTemplate.get
System.out.println(result);
}
/**
* Get 有参
*/
@Test
public void getUserById(){
final String uri = "http://localhost:8080/user/{id}";
Map<String, String> params = new HashMap<String, String>();
params.put("id", "2");
RestTemplate restTemplate = new RestTemplate();
User result = restTemplate.getForObject(uri, User.class, params);
System.out.println(result);
System.out.println("============================");
}
/**post 有参
* 新增用户
*/
@Test
public void postUserBy(){
final String url = "http://localhost:8080/user";
User newUser = new User("王五", "741852");
RestTemplate restTemplate = new RestTemplate();
User result = restTemplate.postForObject( url, newUser, User.class);
//这里传入参数是User对象,所以在web层的UserAPP里面就收参数也要是User类对象,并用@RequestBod注解包裹
System.out.println(newUser);
}
/**Put 有参
* 更新用户
*/
@Test
public void putUserBy(){
final String url = "http://localhost:8080/user";
// Map<String, String> params = new HashMap<String, String>();
// params.put("id", "2");
// params.put("userName" ,"李四");
// params.put("password","777777");
User updatedUser = new User((long) 2, "李四", "258963");
RestTemplate restTemplate = new RestTemplate();
//这里传入参数是User对象,所以在web层的UserAPP里面就收参数也要是User类对象,并用@RequestBod注解包裹
restTemplate.put ( url, updatedUser);
}
/**
* delete 有参
*/
@Test
public void deleteUserById(){
final String uri = "http://localhost:8080/user/{id}";
Map<String, String> params = new HashMap<String, String>();
// params.put("id", "21");
RestTemplate restTemplate = new RestTemplate();
//
restTemplate.delete ( uri, params );
}
}