spring的restTemplate使用

简介: spring的restTemplate使用

spring的restTemplate使用

五:总结
一:什么是RestTemplate?

RestTemplate 是 Spring 框架中的一个 HTTP 客户端工具,它基于 Java 的 HTTPURLConnection 类进行封装,提供了一种简单、方便的方式来访问 RESTful Web 服务。


RestTemplate 可以通过发送 HTTP 请求与 Web 服务进行交互,并支持 GET、POST、PUT、DELETE 等常见的 HTTP 方法。它可以将响应结果转换为 Java 对象或者字符串,方便开发者对响应结果进行处理。


使用 RestTemplate,开发者可以不必手动构建 HTTP 请求和解析响应结果,而是通过简单的 API 调用实现对 Web 服务的访问,大大简化了开发流程,提高了开发效率。


RestTemplate 可以用于访问各种类型的 Web 服务,例如 RESTful Web 服务、SOAP Web 服务、JSON RPC Web 服务等,它的使用方式和原理与访问 RESTful Web 服务类似。

二:如何使用RestTemplate进行发送http请求。

RestTemplate是spring框架提供的,我们这里使用一个springBoot项目举例子。大家不知道怎么配置的可以自行网上查询。

SpringBoot项目不需要进行额外的导包。可以直接使用RestTemplate。需要注意的重点是,RestTemplate是没有交由SpringBean容器管理的,为了方便使用我们可以,编写一个配置类,将RestTemplate交给Spring的容器进行管理。


2.1 RestTemplate的配置类

//标识这是一个配置类
@Configuration
public class BeanUtils {
    @Bean("restTemplate")
    public RestTemplate RestTemplate(){
        return new RestTemplate();
    }
}

2.2 具体使用RestTemplate类型的对象

标识之后,RestTemplate类就可以使用属性注入的方式,进行使用了

  @Service
  public class RestTemplateService {
      @Autowired
      private RestTemplate restTemplate;
   }

三:RestTemplate包含方法RestTemplate 支持常用的 HTTP 请求方法,包括:


GET:获取资源

POST:提交数据并创建资源

PUT:更新资源

DELETE:删除资源

HEAD:获取资源的头部信息

OPTIONS:获取资源支持的 HTTP 方法

PATCH:更新资源的部分内容

除了上述常用的请求方法,RestTemplate 还提供了一些扩展方法,例如 exchange() 方法和 execute() 方法。其中 exchange() 方法允许你指定 HTTP 方法、请求头、请求体和响应类型等详细信息,而 execute() 方法则允许你直接操作请求和响应的 HttpEntity 对象。


四:具体使用

4.1 使用RestTemplate发送get请求。

get请求一共分为两类,getForObject和getForEntity,其中每一类有三个重载方法。


4.1.1 getForEntity

首先在Controller里,提供一个Get类型的方法

@RestController
public class UserController {
   @GetMapping("/hello")
   public String sayHello(String name){
       return "hello"+name;
   }
}

通过getForEntity,我们不仅可以获得响应数据,还可以获得响应头。get请求可以通过3中方式传递参数

    /**
     * @description:占位符拼接参数
     * @author: haolaosan
     * @date: 2023/2/28
     * @param: []
     * @return: java.lang.String
     **/
    public String getForEntity(){
        String url = "http://localhost:8090/restTemplate" +"/hello?name={1}";
        ResponseEntity<String> response = restTemplate.getForEntity(url, String.class, "haolaosan");
        HttpHeaders headers = response.getHeaders();
        System.out.println("响应头headers===="+headers);
        String responseBody = response.getBody();
        System.out.println("响应体body===="+responseBody);
        HttpStatus statusCode = response.getStatusCode();
        System.out.println("响应状态码====" + statusCode);
        return responseBody;
    }
    /**
     * @description:map传递参数
     * @author: haolaosan
     * @date: 2023/2/28
     * @param: []
     * @return: java.lang.String
     **/
    public String getForEntity2(){
        String url = "http://localhost:8090/restTemplate" +"/hello?name={name}";
        Map<String,String> map = new HashMap<>();
        map.put("name","maphaolaosan");
        ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class, map);
        return forEntity.getBody();
    }
    /**
     * @description:参数直接写到url地址内
     * @author: haolaosan
     * @date: 2023/2/28
     * @param: []
     * @return: java.lang.String
     **/
    public String getForEntity3(){
        String url = "http://localhost:8090/restTemplate/hello?name=郝立琢直接拼参";
        ResponseEntity<String> forEntity = restTemplate.getForEntity(url, String.class);
        return forEntity.getBody();
    }

通过观察上文我们可以发现,RestTemplate的getForEntity方法返回的是一个ResponseEntity类型的对象。我们可以通过,getHeads,getBody,getStatusCode方法,分别获取,响应头,响应体,响应状态码。


4.1.2 getForObject

getForObject与getForEntity没有太大不同,他们的不同主要在于,getForObject返回的直接是body体,如果不需要获取响应头,响应状态码等信息,那直接使用getForObject方法无疑会更加方便。

 /**
     * @description:
     * @author: 占位符拼接参数,直接获取响应体
     * @date: 2023/2/28
     * @param: []
     * @return: java.lang.String
     **/
    public String getForObject(){
        String url = "http://localhost:8090/restTemplate" +"/hello?name={1}";
        String forObject = restTemplate.getForObject(url, String.class, "郝立琢obj");
        return forObject;
    }
    /**
     * @description:map传递参数
     * @author: haolizhuo
     * @date: 2023/2/28
     * @param: []
     * @return: java.lang.String
     **/
    public String getForObject2(){
        String url = "http://localhost:8090/restTemplate" +"/hello?name={name}";
        Map<String,String> map = new HashMap<>();
        map.put("name","map郝立琢");
        String forObject = restTemplate.getForObject(url, String.class, map);
        return forObject;
    }
    /**
     * @description:参数直接写到url地址内
     * @author: haolizhuo
     * @date: 2023/2/28
     * @param: []
     * @return: java.lang.String
     **/
    public String getForObject3(){
        String url = "http://localhost:8090/restTemplate/hello?name=郝立琢直接拼参";
        String forObject = restTemplate.getForObject(url, String.class);
        return forObject;
    }

4.2 使用RestTemplate发送post请求

post请求和get请求一样,也有两种发送方式,第一种是postForEntity,另一种是postForObject。和get请求一样,也是是否获取响应头

    @Autowired
    private RestTemplate restTemplate;
    /**
     * @description:post请求,使用forEntity
     * @author: haolizhuo
     * @date: 2023/3/1
     * @param: []
     * @return: java.lang.String
     **/
    public String postForEntity(){
        String url ="http://localhost:8090/restTemplate/hello2";
        //使用key,value的方式进行调用
        Map<String,Object> map = new HashMap<>(16);
        map.put("name","郝立琢post,map传参");
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, map, String.class);
        HttpHeaders headers = responseEntity.getHeaders();
        System.out.println("响应头headers===="+headers);
        String responseBody = responseEntity.getBody();
        System.out.println("响应体body===="+responseBody);
        HttpStatus statusCode = responseEntity.getStatusCode();
        System.out.println("响应状态码====" + statusCode);
        return responseEntity.getBody();
    }
    /**
     * @description:post请求,使用forEntity,传递json数据
     * @author: haolizhuo
     * @date: 2023/3/1
     * @param: []
     * @return: java.lang.String
     **/
    public String postForEntity2(){
        String url ="http://localhost:8090/restTemplate/hello2";
        //使用JSON数据进行传输,在post请求中,可以自动将一个对象转换为JSON数据进行传输
        UserModel userModel = new UserModel();
        userModel.setName("郝立琢使用JSON数据传输");
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, userModel, String.class);
        return responseEntity.getBody();
    }
    /**
     * @description:post请求,使用ForObject,传递json数据
     * @author: haolizhuo
     * @date: 2023/3/1
     * @param: []
     * @return: java.lang.String
     **/
    public String postForObject(){
        String url ="http://localhost:8090/restTemplate/hello2";
        //使用JSON数据进行传输,在post请求中,可以自动将一个对象转换为JSON数据进行传输
        UserModel userModel = new UserModel();
        userModel.setName("郝立琢调用postForObject");
        String postForObject = restTemplate.postForObject(url, userModel, String.class);
        return postForObject;
    }

与get请求不同的是,post请求的传参,是通过json形式传递的,无论我们是使用自己定义的实体进行传参,还是使用map集合进行传参,最后都会被解析成JSON。具体如何选择,应该与我们的业务结合。如果是调用三方,并且不常用,那么我们可以选择直接使用map进行传参就够了,可如果要经常使用这些数据,还是老老实实搞一个model类吧!


五:总结

本文只列出了,get请求与post的请求的使用,至于其他的,put,delete请求,与get和post请求的方式都相差不多,我将这个RestTemplate的例子传到了网盘上,大家如果有兴趣可以下载研究。

链接: https://pan.baidu.com/s/1yidh07u5I6MF_yLkls1ycA?pwd=gkg5 提取码: gkg5 复制这段内容后打开百度网盘手机App,操作更方便哦


目录
相关文章
|
2月前
|
XML 编解码 Java
Spring Boot 中的 RestTemplate和Retrofit 插件很好
Spring Boot 中的 RestTemplate和Retrofit 插件很好
44 1
|
4月前
|
XML Java 开发者
【Spring】Spring是什么?
【Spring】Spring是什么?
【Spring】Spring是什么?
|
22天前
|
Java 数据库连接 数据库
Spring系列文章:Spring使用JdbcTemplate
Spring系列文章:Spring使用JdbcTemplate
|
5月前
|
前端开发 Java 开发者
【Spring】 ——初识Spring
【Spring】 ——初识Spring
39 0
|
5月前
|
存储 Java 数据库
【Spring】——Spring简单 读和取(一)
【Spring】——Spring简单 读和取
46 0
【Spring】——Spring简单 读和取(一)
|
5月前
|
存储 设计模式 Java
【Spring】——Spring简单 读和取(二)
【Spring】——Spring简单 读和取
36 0
【Spring】——Spring简单 读和取(二)
|
9月前
|
Java Spring 容器
【Spring】Spring常用注解(中)
【Spring】Spring常用注解(中)
31 0
|
9月前
|
XML Java 数据格式
【Spring】Spring常用注解(上)
【Spring】Spring常用注解(上)
36 0
|
9月前
|
Java Spring 容器
【Spring】Spring常用注解(下)
【Spring】Spring常用注解(下)
52 0
|
9月前
|
缓存 Java Apache
【Spring Cloud系列】- RestTemplate使用详解(上)
【Spring Cloud系列】- RestTemplate使用详解
193 0