spring boot RestTemplate 发送get请求的踩坑及解决

 更新时间:2021年08月19日 14:22:57   作者:从不喝茶  
这篇文章主要介绍了spring boot RestTemplate 发送get请求的踩坑及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

spring boot RestTemplate 发送get请求踩坑

闲话少说,代码说话

RestTemplate 实例

手动实例化,这个我基本不用

RestTemplate restTemplate = new RestTemplate(); 

依赖注入,通常情况下我使用 java.net 包下的类构建的 SimpleClientHttpRequestFactory

@Configuration
public class RestConfiguration {
    @Bean
    @ConditionalOnMissingBean({RestOperations.class, RestTemplate.class})
    public RestOperations restOperations() {
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setReadTimeout(5000);
        requestFactory.setConnectTimeout(5000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        // 使用 utf-8 编码集的 conver 替换默认的 conver(默认的 string conver 的编码集为 "ISO-8859-1")
        List<HttpMessageConverter<?>> messageConverters = restTemplate.getMessageConverters();
        Iterator<HttpMessageConverter<?>> iterator = messageConverters.iterator();
        while (iterator.hasNext()) {
            HttpMessageConverter<?> converter = iterator.next();
            if (converter instanceof StringHttpMessageConverter) {
                iterator.remove();
            }
        }
        messageConverters.add(new StringHttpMessageConverter(Charset.forName("UTF-8")));
        return restTemplate;
    }
}

请求地址

get 请求 url 为

http://localhost:8080/test/sendSms?phone=手机号&msg=短信内容

错误使用

@Autowired
private RestOperations restOperations;
public void test() throws Exception{
    String url = "http://localhost:8080/test/sendSms";
    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("phone", "151xxxxxxxx");
    uriVariables.put("msg", "测试短信内容");
    String result = restOperations.getForObject(url, String.class, uriVariables);
}

服务器接收的时候你会发现,接收的该请求时没有参数的

正确使用

@Autowired
private RestOperations restOperations;
public void test() throws Exception{
    String url = "http://localhost:8080/test/sendSms?phone={phone}&msg={phone}";
    Map<String, Object> uriVariables = new HashMap<String, Object>();
    uriVariables.put("phone", "151xxxxxxxx");
    uriVariables.put("msg", "测试短信内容");
    String result = restOperations.getForObject(url, String.class, uriVariables);
}

等价于

@Autowired
private RestOperations restOperations;
public void test() throws Exception{
    String url = "http://localhost:8080/test/sendSms?phone={phone}&msg={phone}";
    String result = restOperations.getForObject(url, String.class,  "151xxxxxxxx", "测试短信内容");
}

springboot restTemplate访问get,post请求的各种方式

springboot中封装好了访问外部请求的方法类,那就是RestTemplate。下面就简单介绍一下,RestTemplate访问外部请求的方法。

get请求

首先get请求的参数是拼接在url后面的。所以不需要额外添加参数。但是也需要分两种情况。

1、 有请求头

由于 getForEntity() 和 getForObject() 都无法加入请求头。所以需要请求头的连接只能使用 exchange() 来访问。代码如下

public JSONObject test(){
        try {
            RestTemplate re = new RestTemplate();
            HttpHeaders headers = new HttpHeaders();
            String url = "http://test.api.com?id=123";
            headers.set("Content-Type","application/json");
            HttpEntity<JSONObject> jsonObject= re.exchange(url, HttpMethod.GET,new HttpEntity<>(headers),JSONObject.class);
            log.info("返回:{}",jsonObject.getBody());
            return jsonObject.getBody();
        }catch (Exception e){
            log.error(e.getMessage());
        }
        return null;
    }

2、 无请求头

无需请求头的可以用三个方法实现。getForEntity() 和 getForObject() 还有 exchange() 都可以实现。下面讲前两种用的比较多的。

getForEntity()

public JSONObject test(){
        try {
            RestTemplate re = new RestTemplate();
            String url = "http://api.help.bj.cn/apis/alarm/?id=101020100";
            HttpEntity<JSONObject> jsonObject= re.getForEntity(url,JSONObject.class);
            log.info("返回:{}",jsonObject.getBody());
            return jsonObject.getBody();
        }catch (Exception e){
            log.error(e.getMessage());
        }
        return null;
    }

getForObject()

public JSONObject test(){
        try {
            RestTemplate re = new RestTemplate();
            String url = "http://api.help.bj.cn/apis/alarm/?id=101020100";
            JSONObject jsonObject= re.getForObject(url,JSONObject.class);
            log.info("返回:{}",jsonObject);
            return jsonObject;
        }catch (Exception e){
            log.error(e.getMessage());
        }
        return null;
    }

post请求

post请求也分几种情况

1、参数在body的form-data里面

public static JSONObject test(){
        try {
            RestTemplate re = new RestTemplate();
            String url = "http://localhost:8101/test";
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.MULTIPART_FORM_DATA);
            MultiValueMap<String, Object> loginJson = new LinkedMultiValueMap<>();
            loginJson.add("id", "123");
            JSONObject jsonObject= re.postForObject(url,new HttpEntity<>(loginJson,headers),JSONObject.class);
            log.info("返回:{}",jsonObject);
            return jsonObject;
        }catch (Exception e){
            log.error(e.getMessage());
        }
        return null;
    }

还可以把 postForObject 换成 postForEntity

2、参数在body的x-www-from-urlencodeed里面

只需要把请求头的setContentType改成下面即可

headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
public static JSONObject test(){
        try {
            RestTemplate re = new RestTemplate();
            String url = "http://localhost:8101/test";
            HttpHeaders headers = new HttpHeaders();
            headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
            MultiValueMap<String, Object> loginJson = new LinkedMultiValueMap<>();
            loginJson.add("id", "123");
            JSONObject jsonObject= re.postForObject(url,new HttpEntity<>(loginJson,headers),JSONObject.class);
            log.info("返回:{}",jsonObject);
            return jsonObject;
        }catch (Exception e){
            log.error(e.getMessage());
        }
        return null;
    }

3、参数在body的raw里面

在这里插入图片描述

 public static JSONObject test(){
        try {
            RestTemplate re = new RestTemplate();
            String url = "http://localhost:8101/test";
            HttpHeaders headers = new HttpHeaders();
            headers.set("Content-Type","application/json");
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("id","1");
            JSONObject jsonObject1 = restTemplate
                    .postForObject(url,new HttpEntity<>(jsonObject,headers),JSONObject.class);
            log.info("返回:{}",jsonObject1);
            return jsonObject;
        }catch (Exception e){
            log.error(e.getMessage());
        }
        return null;
    }

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

相关文章

  • 解决springboot的findOne方法没有合适的参数使用问题

    解决springboot的findOne方法没有合适的参数使用问题

    这篇文章主要介绍了解决springboot的findOne方法没有合适的参数使用问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • IntelliJ IDEA中使用mybatis-generator的示例

    IntelliJ IDEA中使用mybatis-generator的示例

    这篇文章主要介绍了IntelliJ IDEA中使用mybatis-generator,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04
  • springboot+vue实现页面下载文件

    springboot+vue实现页面下载文件

    这篇文章主要为大家详细介绍了springboot+vue实现页面下载文件,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-12-12
  • java继承学习之super的用法解析

    java继承学习之super的用法解析

    本文介绍java继承super的用法,Java继承是会用已存在的类的定义作为基础建立新类的技术新类的定义可以增加新的数据或者新的功能,也可以使用父类的功能,但不能选择性的继承父类 这种继承使得复用以前的代码非常容易,能够大大的缩短开发的周期,需要的朋友可以参考下
    2022-02-02
  • 全面解析Java main方法

    全面解析Java main方法

    main方法是我们学习Java语言学习的第一个方法,也是每个java使用者最熟悉的方法,每个Java应用程序都必须有且仅有一个main方法。这篇文章通过实例代码给大家介绍java main方法的相关知识,感兴趣的朋友跟随脚本之家小编一起学习吧
    2018-05-05
  • Springboot POI导出Excel(浏览器)

    Springboot POI导出Excel(浏览器)

    这篇文章主要为大家详细介绍了Springboot POI导出Excel,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • java 实现简单圣诞树的示例代码(圣诞节快乐)

    java 实现简单圣诞树的示例代码(圣诞节快乐)

    这篇文章主要介绍了java 实现简单圣诞树的示例代码(圣诞节快乐),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • Netty分布式FastThreadLocal的set方法实现逻辑剖析

    Netty分布式FastThreadLocal的set方法实现逻辑剖析

    这篇文章主要为大家介绍了Netty分布式FastThreadLocal的set方法实现逻辑剖析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-03-03
  • java自定义注解验证手机格式的实现示例

    java自定义注解验证手机格式的实现示例

    这篇文章主要介绍了java自定义注解验证手机格式的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-03-03
  • Java后台如何处理日期参数格式

    Java后台如何处理日期参数格式

    这篇文章主要介绍了Java后台如何处理日期参数格式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07

最新评论