首页 > 其他分享 >Spring之RestTemplate使用小结

Spring之RestTemplate使用小结

时间:2023-12-28 11:24:07浏览次数:23  
标签:String url Spring RestTemplate request class restTemplate 小结 public

Spring之RestTemplate使用小结

1. 基本接口

捞出源码,看一下其给出的一些常用接口,基本上可以分为下面几种

// get 请求
public <T> T getForObject();
public <T> ResponseEntity<T> getForEntity();

// head 请求
public HttpHeaders headForHeaders();

// post 请求
public URI postForLocation();
public <T> T postForObject();
public <T> ResponseEntity<T> postForEntity();

// put 请求
public void put();

// pathch 
public <T> T patchForObject

// delete
public void delete()

// options
public Set<HttpMethod> optionsForAllow

// exchange
public <T> ResponseEntity<T> exchange()


2. Get请求

从上面的接口命名上,可以看出可以使用的有两种方式 getForObjectgetForEntity,那么这两种有什么区别?

  • 从接口的签名上,可以看出一个是直接返回预期的对象,一个则是将对象包装到 ResponseEntity 封装类中
  • 如果只关心返回结果,那么直接用 GetForObject 即可
  • 如果除了返回的实体内容之外,还需要获取返回的header等信息,则可以使用 getForEntit

b. getForObject方式

首先看下完整的接口签名

复制代码@Nullable
public <T> T getForObject(String url, Class<T> responseType, Object... uriVariables) throws RestClientException ;

@Nullable
public <T> T getForObject(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException ;

@Nullable
public <T> T getForObject(URI url, Class<T> responseType) throws RestClientException;

有三个重载的方法,从接口上也比较容易看出如何使用,其中有点疑惑的则是第一钟,参数应该怎么传了,下面给出上面几种的使用姿势

public class RestTestmplateTest {
    private RestTemplate restTemplate;

    @Before
    public void init() {
        restTemplate = new RestTemplate();
    }

    @lombok.Data
    static class InnerRes {
        private Status status;
        private Data result;
    }

    @lombok.Data
    static class Status {
        int code;
        String msg;
    }

    @lombok.Data
    static class Data {
        long id;
        String theme;
        String title;
        String dynasty;
        String explain;
        String content;
        String author;
    }

    @Test
    public void testGet() {
        // 使用方法一,不带参数
        String url = "https://story.hhui.top/detail?id=666106231640";
        InnerRes res = restTemplate.getForObject(url, InnerRes.class);
        System.out.println(res);


        // 使用方法一,传参替换
        url = "https://story.hhui.top/detail?id={?}";
        res = restTemplate.getForObject(url, InnerRes.class, "666106231640");
        System.out.println(res);

        // 使用方法二,map传参
        url = "https://story.hhui.top/detail?id={id}";
        Map<String, Object> params = new HashMap<>();
        params.put("id", 666106231640L);
        res = restTemplate.getForObject(url, InnerRes.class, params);
        System.out.println(res);

        // 使用方法三,URI访问
        URI uri = URI.create("https://story.hhui.top/detail?id=666106231640");
        res = restTemplate.getForObject(uri, InnerRes.class);
        System.out.println(res);
    }
}

看上面的testcase,后面两个方法的使用没什么好说的,主要看一下org.springframework.web.client.RestTemplate#getForObject(java.lang.String, java.lang.Class<T>, java.lang.Object...) 的使用姿势

  • 根据实际传参替换url模板中的内容
  • 使用方法一时,模板中使用 {?} 来代表坑位,根据实际的传参顺序来填充
  • 使用方法二时,模板中使用 {xx}, 而这个xx,对应的就是map中的key

c. getForEntity方式

既然getForObject有三种使用方法,那么getForEntity理论上也应该有对应的三种方式

public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Object... uriVariables) throws RestClientException ;
public <T> ResponseEntity<T> getForEntity(String url, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;
public <T> ResponseEntity<T> getForEntity(URI url, Class<T> responseType) throws RestClientException;

3. Post请求

从上面的接口说明上看,post请求除了有forObject 和 forEntity之外,还多了个forLocation;其次post与get一个明显的区别就是传参的姿势问题,get的参数一般会待在url上;post的则更常见的是通过表单的方式提交

因此接下来关注的重点在于forLocation是什么,以及如何传参

a. postForObject方法

首先看一下接口签名

复制代码public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Object... uriVariables) throws RestClientException ;

public <T> T postForObject(String url, @Nullable Object request, Class<T> responseType, Map<String, ?> uriVariables) throws RestClientException;

public <T> T postForObject(URI url, @Nullable Object request, Class<T> responseType) throws RestClientException ;

上面的三个方法,看起来和前面并没有太大的区别,只是多了一个request参数,那么具体的使用如何呢?

@Test
public void testPost() {
    String url = "http://localhost:8080/post";
    String email = "[email protected]";
    String nick = "一灰灰Blog";
	
    // 表单参数
    MultiValueMap<String, String> request = new LinkedMultiValueMap<>();
    request.add("email", email);
    request.add("nick", nick);

    // 使用方法三
    URI uri = URI.create(url);
    String ans = restTemplate.postForObject(uri, request, String.class);
    System.out.println(ans);

    // 使用方法一
    ans = restTemplate.postForObject(url, request, String.class);
    System.out.println(ans);

    // 使用方法一,但是结合表单参数和uri参数的方式,其中uri参数的填充和get请求一致
    request.clear();
    request.add("email", email);
    ans = restTemplate.postForObject(url + "?nick={?}", request, String.class, nick);
    System.out.println(ans);


    // 使用方法二
    Map<String, String> params = new HashMap<>();
    params.put("nick", nick);
    ans = restTemplate.postForObject(url + "?nick={nick}", request, String.class, params);
    System.out.println(ans);
}

b. 传递Json

 
    /**
     * post请求json数据(添加请求头)并传递表单参数
     */
    public static  void test2(){
         RestTemplate restTemplate = new RestTemplate();
        
 		// 表单参数
         Map<String, String> params = new HashMap<String, String>();
        params.put("id", "123");
        
        //创建请求头
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
 
        String url = "http://localhost:8087/callBackFor?id={id}";
       
        // Json参数
        User student = new User("sansan",10);
        HttpEntity<User> entity = new HttpEntity<User>(student, headers);
        
        ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, entity, String.class, params);
        String user = responseEntity.getBody();//{"msg":"调用成功!","code":1}
        System.out.println(user);
    }

c. postForEntity

和前面的使用姿势一样,无非是多了一层包装而已,略过不讲

标签:String,url,Spring,RestTemplate,request,class,restTemplate,小结,public
From: https://www.cnblogs.com/firsthelloworld/p/17932315.html

相关文章

  • 【Spring】SpringMVC项目升级成SpringBoot实践
    将SpringMVC项目升级为SpringBoot项目需要一系列详细的步骤。以下是一个更详细的步骤指南:项目初始化:创建一个新的SpringBoot项目。您可以使用SpringInitializr或SpringBoot的Maven插件来快速生成项目结构。依赖管理:在新项目中,添加所需的依赖。根据您的项目需求,添加SpringBoot......
  • VS Code 设置 Spring Boot2.x 项目启动参数与 VM 参数
    参考https://blog.csdn.net/Jawfneo/article/details/101677042环境环境版本说明windows10vscode1.85.1SpringBootExtensionPackv0.2.1vscode插件ExtensionPackforJavav0.25.15vscode插件JDK11Springboot2.3.12.RELEASEApach......
  • spring原理(一)
    定义bean类的属性值类publicclassPropertyValue{privatefinalStringname;privatefinalObjectvalue;publicPropertyValue(Stringname,Objectvalue){this.name=name;this.value=value;}publicStringgetName()......
  • springboot 共享session
    在SpringBoot中,可以使用SpringSession来实现共享session。SpringSession是一个基于Spring的会话管理框架,它提供了跨多个服务器的会话共享功能。要使用SpringSession实现共享session,需要按照以下步骤进行配置:添加依赖在SpringBoot项目的pom.xml文件中添加SpringSession的依赖:x......
  • Spring Boot2.x 集成 Skywalking 9.1.0
    参考https://skywalking.apache.org/https://www.cnblogs.com/xiaqiuchu/p/17931230.html(本文使用的该文章的代码,进入可下载源码)https://juejin.cn/post/7001849172278116389#heading-7注意事项本文代码环境为单注册中心、单服务提供者、单消费者。管理面板左侧菜单在没......
  • Spring MVC (文件上传下载)
     1.介绍1)三层架构:表现层(UI):负责数据展示;业务层(BLL):负责业务处理;数据层(DAL):负责数据操作; 2)MVCSpringMVC(Model-View-Controller)是Spring的一部分,基于Java的Web框架,用于开发Web应用框架。提供一种模型(Model)-视图(Vie......
  • Spring Boot2.x 集成 Eureka 与 Feign
    参考https://blog.csdn.net/m0_37959155/article/details/122521406https://blog.csdn.net/Shnywe/article/details/123682758https://www.cnblogs.com/yxth/p/10845640.htmlhttps://juejin.cn/post/6973680096011878407本文完整代码下载注意事项Feign集成了Hystrix......
  • spring MVC 后端 接收 前端 批量添加的数据(简单示例)
    <%@pagecontentType="text/html;charset=UTF-8"language="java"%><html><head>  <title>Title</title></head><body><scriptsrc="${pageScope.request.ContextPath}/js/jquery-3.3.1.min.js&qu......
  • 基于Spring Boot2.x 集成 Spring Cloud Gateway
    参考https://blog.csdn.net/DCTANT/article/details/108125229(boot与cloud的版本关系)https://blog.csdn.net/yuanchangliang/article/details/109579705https://blog.csdn.net/qq_38380025/article/details/102968559本文代码下载环境环境版本说明windows1......
  • Spring Boot学习随笔- 后端实现全局异常处理(HandlerExceptionResolver),前后端解决跨域
    学习视频:【编程不良人】2021年SpringBoot最新最全教程第十七章、异常处理异常处理作用:用来解决整合系统中任意一个控制器抛出异常时的统一处理入口传统方式传统单体架构下的处理方式配置全局异常处理类@ComponentpublicclassGlobalExceptionResolverimplementsHand......