RestTemplate

 

 

在日常项目开发中,有时候我们需要调用第三方接口数据,常用的方法有传统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 );

    }



}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值