Spring RestTemplate的使用与踩坑

 更新时间:2023年02月10日 10:33:26   作者:爱学习的大雄  
RestTemplate是一个执行HTTP请求的同步阻塞式工具类,它仅仅只是在HTTP客户端库基础上,封装了更加简单易用的模板方法API,方便程序员利用已提供的模板方法发起网络请求和处理,能很大程度上提升我们的开发效率

引言

最近的项目需求中有使用到后端发送http请求,在网上寻找资料后发现可以使用spring自带的RestTemplate类实现,故作此记录

项目使用

将下述代码引入spring容器中(RestTemplate是spring自带的发送http请求的类)

@Bean
public RestTemplate restTemplate(ClientHttpRequestFactory factory) {
    RestTemplate restTemplate = new RestTemplate(factory);
    return restTemplate;
}
@Bean
public ClientHttpRequestFactory simpleClientHttpRequestFactory() {
    SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();
    factory.setReadTimeout(5000);
    factory.setConnectTimeout(15000);
    // 设置代理
    //factory.setProxy(null);
    return factory;
}

在需要使用的类中直接引入即可

@Autowired
private RestTemplate restTemplate;

代码示例

这里简单示例下post请求,如果又其它需求的可以去搜索一下其它文章

**注意:**发送的post的传参的类型一定要是LinkedMultiValueMap(不能使用jsonobject),否则会报找不到数据的错误

@GetMapping("send")
public String testPost(@RequestParam("code") Integer code){
    String url = "http://localhost:8888/oauth/return";
    LinkedMultiValueMap<String, Object> stringObjectLinkedMultiValueMap = new LinkedMultiValueMap<>();
    stringObjectLinkedMultiValueMap.set("code",code);
    HttpEntity<LinkedMultiValueMap<String, Object>> jsonObjectHttpEntity = new HttpEntity<>(stringObjectLinkedMultiValueMap);
    ResponseEntity<String> stringResponseEntity = restTemplate.postForEntity(url, jsonObjectHttpEntity, String.class);
    String body = stringResponseEntity.getBody();
    return body;
}
@PostMapping("return")
public String returnPost(@RequestParam Integer code){
    return "哈首府帕斯发";
}

踩坑记录

发送POST请求传参的问题

如下代码,如果使用jsonobject来装载数据发送post请求是会报错的,只能使用LinkedMultiValueMap

@GetMapping("keycloak/getToken")
public String keycloakGetToken(@RequestParam Map<String,String> map){
    //String code = requestObj.getString("code");
    String url = "http://localhost:8081/auth/realms/myRealm/protocol/openid-connect/token";
    String code = map.get("code");
    System.out.println("传进来的code:"+code);
    //HttpHeaders headers = new HttpHeaders();
    //JSONObject jsonObject = new JSONObject();
    //jsonObject.put("grant_type","authorization_code");
    //jsonObject.put("code",code);
    //jsonObject.put("client_id","myclient");
    //jsonObject.put("client_secret","LsvDoZ5g0BQhRDR9ydYqV9tjal8YDeAI");
    //jsonObject.put("scope","openid");
    //jsonObject.put("redirect_uri","http://localhost:8888/oauth/keycloak/getToken");
    //HttpEntity<JSONObject> jsonObjectHttpEntity = new HttpEntity<>(jsonObject,headers);
    LinkedMultiValueMap<String, Object> stringObjectLinkedMultiValueMap = new LinkedMultiValueMap<>();
    stringObjectLinkedMultiValueMap.set("grant_type","authorization_code");
    stringObjectLinkedMultiValueMap.set("code",code);
    stringObjectLinkedMultiValueMap.set("client_id","myclient");
    stringObjectLinkedMultiValueMap.set("client_secret","LsvDoZ5g0BQhRDR9ydYqV9tjal8YDeAI");
    stringObjectLinkedMultiValueMap.set("scope","openid");
    stringObjectLinkedMultiValueMap.set("redirect_uri","http://localhost:8888/oauth/keycloak/getToken");
    HttpEntity<LinkedMultiValueMap<String, Object>> jsonObjectHttpEntity = new HttpEntity<>(stringObjectLinkedMultiValueMap);
    ResponseEntity<String> responseEntity = restTemplate.postForEntity(url, jsonObjectHttpEntity, String.class);
    String body = responseEntity.getBody();
    return body;
}

到此这篇关于Spring RestTemplate的使用与踩坑的文章就介绍到这了,更多相关Spring RestTemplate内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • mybatis and,or复合查询操作

    mybatis and,or复合查询操作

    这篇文章主要介绍了mybatis and,or复合查询操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • 利用SpringBoot和LiteFlow解锁复杂流程

    利用SpringBoot和LiteFlow解锁复杂流程

    随着业务的复杂化,企业需要更加高效、便捷地管理自己的业务流程,这就需要借助一些流程引擎实现,今天,我们就来介绍一种基于Java语言开发的轻量级工作流引擎——LiteFlow,以及如何在Spring Boot框架中集成它,从而提高企业的工作效率和开发效率
    2023-06-06
  • IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法

    在IDEA中就提供了一个帮助你回退代码的机会,但这个方法并不是万能的,好了,下面就来具体说说IDEA Debug过程中使用Drop Frame或Reset Frame实现操作回退的方法,感兴趣的朋友一起看看吧
    2022-04-04
  • 虚拟机linux中jdk安装配置方法

    虚拟机linux中jdk安装配置方法

    这篇文章主要为大家详细介绍了虚拟机linux中jdk安装配置方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-08-08
  • 在SpringBoot中通过jasypt进行加密解密的方法

    在SpringBoot中通过jasypt进行加密解密的方法

    今天小编就为大家分享一篇关于在SpringBoot中通过jasypt进行加密解密的方法,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-01-01
  • 详解Java中的三种流程控制语句

    详解Java中的三种流程控制语句

    这篇文章主要介绍了Java中常用的三种流程控制语句的使用,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2022-04-04
  • Sentinel Gateway自定义限流返回结果方式

    Sentinel Gateway自定义限流返回结果方式

    这篇文章主要介绍了Sentinel Gateway自定义限流返回结果方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04
  • JAVA如何判断上传文件后缀名是否符合规范MultipartFile

    JAVA如何判断上传文件后缀名是否符合规范MultipartFile

    这篇文章主要介绍了JAVA判断上传文件后缀名是否符合规范MultipartFile,文中通过实例代码介绍了java实现对上传文件做安全性检查,需要的朋友可以参考下
    2023-11-11
  • SpringBoot整合OpenFeign的坑

    SpringBoot整合OpenFeign的坑

    最近试用SpringBoot+K8S,遇到了个坑,通过OpenFeign请求返回值LocalDateTime发生了异常,本文就详细的介绍一下解决方法,感兴趣的可以了解一下
    2021-07-07
  • MyBatis在DAO层定义接口返回类型泛型无效的解决

    MyBatis在DAO层定义接口返回类型泛型无效的解决

    这篇文章主要介绍了MyBatis在DAO层定义接口返回类型泛型无效的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-07-07

最新评论