SpringBoot 如何使用RestTemplate来调用接口

 更新时间:2021年10月23日 11:08:46   作者:奚学长又装死  
这篇文章主要介绍了SpringBoot 如何使用RestTemplate来调用接口方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

使用RestTemplate来调用接口

1.新建一个配置类,配置RestTemplate的Bean

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.ClientHttpRequestFactory;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;
 
/**
 * RestTemplate配置模板
 *
 * @author like
 */
@Configuration
public class RestTemplateConfig {
 
    @Bean
    public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
        return new RestTemplate(factory);
    }
 
    @Bean
    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
        factory.setReadTimeout(5000);//单位为ms
        factory.setConnectTimeout(5000);//单位为ms
        return factory;
    } 
}

注意点:如果在编译器中提示factory不能自动注入,那应该时跟其他类有冲突,有多个 ClientHttpRequestFactory

把这个factory的名字改一下,改成其他的就好了,比如这里就直接改成 simpleClientHttpRequestFactory

2.多种传输和接收参数的方式

2.1postForObject方法

postForObject指post请求,并返回一个Object对象。

  • 第1个参数:请求的url地址
  • 第2个参数:其实是HttpEntity,这个类主要有三种构造方法,如下

new HttpEntity(请求体)

new HttpEntity(请求头)

new HttpEntity(请求体,请求头)

  • 第3个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
  • 第4个参数:参数值,这里有Map和 可变参数两种形式(通常用不到,数据通常放在Json里就全部传输过去了)

2.1.1使用Json来传递和接收数据

首先引入fastJson的pom配置

<!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
		<dependency>
			<groupId>com.alibaba</groupId>
			<artifactId>fastjson</artifactId>
			<version>1.2.49</version>
		</dependency>

在实现类中注入RestTemplate

接下来new一个 ExpressionDomain 对象,将这个对象转化成JSONObject。使用Json来传递数据

public void postByDefault()
{
    ExpressionDomain expressionDomain=new ExpressionDomain("hello","hasaki","win");
    JSONObject jsonObj = (JSONObject) JSONObject.toJSON(expressionDomain);
    
    //设置请求头
    HttpHeaders headers = new HttpHeaders();
    headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
    headers.add("Accept", MediaType.APPLICATION_JSON.toString());
 
    //请求体
    HttpEntity<String> formEntity = new HttpEntity<String>(jsonObj.toString(), headers);
    
    //发起请求
    String jsonResult = restTemplate.postForObject("http://localhost:8081/findDataByReflection" , formEntity, String.class);
    
    //将Json字符串解析成对象
    Response resp = JSON.parseObject(jsonResult, new TypeReference<Response>() {});
}

接收端

@RequestBody注解一个参数,用于自动解析Json为对象。返回的Response也是一个对象,添加@ResponseBody注解,将返回Json字符串。解析的时候将Json字符串解析成对象即可。

postForEntity

和getForEntity原理是一样的,下面会讲到。

2.2getForObject方法

getForObject指get请求,并返回一个Object对象。这里有3种方法。

  • 第1个参数:请求的url地址
  • 第2个参数:返回的结果类型,这里String.class表示返回结果是一个字符串。
  • 第3个参数:参数值,这里有Map和 可变参数两种形式

2.2.1 通过Map传参数的方式

可以使用map来封装请求参数,并作为getForObject的第三个参数,同时修改url如下,map中的"1"会替换url中的{1},"2"会替换url中的{2}

Map map = new HashMap();
map.put("1", "hello");
map.put("2", "world");
String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class,map);

接口端:

@RequestMapping(value = "/getIds", method = RequestMethod.GET)
public @ResponseBody String getIds(String param1, String param2) {
    return param1 + param2;
}

2.2.2 通过可变参数的方式

也可以直接将要传递的值放到getForObject方法的参数结尾,数量不限,它会按顺序替换{1}和{2}。接口端代码还是和2.2.1的一样

String result = restTemplate.getForObject("http://localhost:8081/getIds?param1={1}&param2={2}", String.class, "hello", "world");

2.3getForEntity方法

getForEntity和getForObject的用法是一样的,只是其返回结果是一个ResponseEntity,其中包含了更多的响应信息,比如:

		ResponseEntity response = restTemplate.getForEntity("http://localhost:8081/getIds",String.class);
		response.getHeaders();		//响应头
		response.getStatusCode();	//响应码
		response.getBody();			//响应体,即前面的result

RestTemplate调用接口总结

1.这是接口信息

    @PostMapping("/testm")
    public ReturnResult show11(@RequestParam("id") String id,
                               @RequestParam("name") String name) {
        System.out.println(id);
        UserInfo userInfo = userInfoMapper.selectByUserName(name); 
        return ReturnResult.create(userInfo);
    }

这是restTemplate调用

    //Post,@RequestParam---postForEntity
    @Test
    public void sho11() {
        String url = "http://127.0.0.1:8099/user/testm";
        MultiValueMap<String, String> request = new LinkedMultiValueMap<>();
        request.add("id", "12324");
        request.add("name", "nanc");
 
        ResponseEntity<ReturnResult> resp = restTemplate.postForEntity(url, request, ReturnResult.class);
        ReturnResult body = resp.getBody();
        UserInfo data = body.getData();
        System.err.println(data.getUserId());
        System.out.println(data);  
    }

2.接口

    @GetMapping("/testp")
    public ReturnResult show22(@RequestParam String name,
                               @RequestParam Integer age,
                               @RequestParam String clazz) {
        System.out.println(name + "-" + age + "-" + clazz);
        UserInfo userInfo = userInfoMapper.selectByUserName(name);
        return ReturnResult.create(userInfo);
    }

resttemplate

    //Get ,@RequestParam-----getForObject
    @Test
    public void sho12() {
        String url = "http://127.0.0.1:8099/rest/testp?name={name}&age={age}&clazz={clazz}";
        Map<String, Object> map = new HashMap<>();
        map.put("name", "nanc");
        map.put("age", 34);
        map.put("clazz", "12");
        ReturnResult forObject = restTemplate.getForObject(url, ReturnResult.class, map);
        UserInfo data = forObject.getData();
        System.out.println(data);
    }
 

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java基础入门语法--String类

    Java基础入门语法--String类

    字符串广泛应用在Java编程中,在Java中字符串属于对象,Java 提供了String类来创建和操作字符串,今天给大家介绍Java基础入门语法--String类的相关知识,感兴趣的朋友一起看看吧
    2021-06-06
  • Java基于递归解决全排列问题算法示例

    Java基于递归解决全排列问题算法示例

    这篇文章主要介绍了Java基于递归解决全排列问题算法,结合实例形式分析了Java使用递归算法解决全排列问题的原理与具体实现技巧,需要的朋友可以参考下
    2017-11-11
  • java 中序列化与readResolve()方法的实例详解

    java 中序列化与readResolve()方法的实例详解

    这篇文章主要介绍了java 中序列化与readResolve()方法的实例详解的相关资料,这里提供实例帮助大家理解这部分知识,需要的朋友可以参考下
    2017-08-08
  • 基于java中泛型的总结分析

    基于java中泛型的总结分析

    本篇文章介绍了,在java中泛型的总结分析。需要的朋友参考下
    2013-05-05
  • SpringBoot Security密码加盐实例

    SpringBoot Security密码加盐实例

    这篇文章主要为打击介绍了SpringBoot Security密码加盐实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • java Class.getSimpleName() 详解及用法

    java Class.getSimpleName() 详解及用法

    这篇文章主要介绍了java Class.getSimpleName() 详解及用法的相关资料,需要的朋友可以参考下
    2017-02-02
  • SpringBoot Security安装配置及Thymeleaf整合

    SpringBoot Security安装配置及Thymeleaf整合

    这篇文章主要介绍了SpringBoot Security安装配置及Thymeleaf整合,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-12-12
  • Java 基础全面讲解StringBuffer类的使用

    Java 基础全面讲解StringBuffer类的使用

    当对字符串进行修改的时候,需要使用 StringBuffer 和 StringBuilder类,和String类不同的是,StringBuffer和 StringBuilder类的对象能够被多次的修改,并且不产生新的未使用对象
    2022-01-01
  • Java并发教程之Callable和Future接口详解

    Java并发教程之Callable和Future接口详解

    Java从发布的第一个版本开始就可以很方便地编写多线程的应用程序,并在设计中引入异步处理,这篇文章主要给大家介绍了关于Java并发教程之Callable和Future接口的相关资料,需要的朋友可以参考下
    2021-07-07
  • Spring RestTemplate远程调用过程

    Spring RestTemplate远程调用过程

    这篇文章主要介绍了Spring RestTemplate远程调用过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-11-11

最新评论