SpringBoot使用RestTemplate发起GET和POST请求

11 篇文章 0 订阅
5 篇文章 1 订阅
不说废话,先贴代码:

网上好多代码放到自己机器上错误一大堆,今天刚好有空就自己写了http工具类,下面代码都是基于SpringBoot环境的(RestTemplate类在spring-boot-starter-web包里面),大家可以根据自己情况自行改变…
(1)RestTemplate实例的配置类:

@Configuration
public class RestConfig {
    public RestConfig(){
        System.out.println("RestConfig已配置");
    }
    @Bean
    public RestTemplate restTemplate(){
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        //连接20秒超时
        requestFactory.setConnectTimeout(GlobalConfig.HTTP_CONN_TIME_OUT*1000);
        //读数20秒超时
        requestFactory.setReadTimeout(GlobalConfig.HTTP_READ_TIME_OUT*1000);
        return new RestTemplate(requestFactory);
    }
    //下面也可以配置连接数量、并发数等配置,就不具体展开了
}

(2)然后就可以直接开始写发起get和post连接的代码:

@Component
public class RestTemplateUtil {
    @Autowired
    private RestTemplate restTemplate;
    private static RestTemplate request;
	@PostConstruct
    public void init() {
        request = restTemplate;
    }
      /**
     * @return 泛型T
     * @Description get请求
     * @Date 2020-04-11
     */
    public static <T> T requestForGet(String url, Map<String, Object> params, Class<T> clazz) throws Exception{
        HttpHeaders headers = new HttpHeaders();
        headers.add("Accept", "application/json");
        headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(null, headers);
        ResponseEntity<T> response;
        try {
            response = request.exchange(url, HttpMethod.GET, requestEntity, clazz, params);
        } catch (Exception e) {
            throw new Exception("资源链接访问异常");
        }
        return response.getStatusCode().is2xxSuccessful() ? response.getBody() : null;
    }

    /**
     * @return 泛型T
     * @Description post请求
     * @Date 2020-04-11
     */
    public static <T> T requestForPost(String url, Map<String, Object> params, Class<T> clazz){
        HttpHeaders headers = new HttpHeaders();    headers.setContentType(MediaType.parseMediaType(MediaType.APPLICATION_JSON_UTF8_VALUE));
        HttpEntity<Map<String, Object>> requestEntity = new HttpEntity<>(params, headers);
        ResponseEntity<T> response = null;
        response = request.exchange(url, HttpMethod.POST, requestEntity, clazz);
        return response.getStatusCode().is2xxSuccessful() ? response.getBody() : null;
    }
}

解释:

上面两个方法怎么传参数:
(1)现在需要获取连接http://localhost:9090/ad/test返回的内容,get方式,没有参数:
因为这个链接返回的是Response数据类型,因此还需要自定义一个Response类:

public class Response<T extends Object> {
    private int returnValue;
    private String returnMsg;
    private T returnData;



    public int getReturnValue() {
        return returnValue;
    }

    public void setReturnValue(int returnValue) {
        this.returnValue = returnValue;
    }

    public String getReturnMsg() {
        return returnMsg;
    }

    public void setReturnMsg(String returnMsg) {
        this.returnMsg = returnMsg;
    }

    public T getReturnData() {
        return returnData;
    }

    public void setReturnData(T returnData) {
        this.returnData = returnData;
    }

}

 String url="http://localhost:9090/ad/test";
 Map<String,Object> params=new HashMap<>();
 Response response = RestTemplateUtil.requestForGet(url,params,Response.class);

注意:上面链接不需要传参数,也不能在params这个位置传一个null,必须传一个Map的对象,不然会报错。

(2)现在需要获取连接http://localhost:9090/ad/test?name=qz&&age=18返回的内容,get方式,有参数(后台代码对应用@RequestParam注解接收参数):

 String url="http://localhost:9090/ad/test?name={name}&age={age}";
 Map<String,Object> params=new HashMap<>();
 params.put("name","qz");
 params.put("age",18);
 Response response = RestTemplateUtil.requestForGet(url,params,Response.class);

注意:上面链接需要传参数,但是不能直接把url写成http://localhost:9090/ad/test?name=qz&&age=18,需要像上面那样在链接中提供参数占位符,然后把参数添加在Map当中,不然会提示找不到参数。

(3)现在需要获取连接http://localhost:9090/ad/test返回的内容,post方式,没有参数,与(1)一样,把调用的方法换成requestForPost就行了。

(4)现在需要获取连接http://localhost:9090/ad/test返回的内容,post方式,有参数(后台代码对应用@RequestBody注解接收参数),这个与(2)不一样,不需要参数占位符。

 String url="http://localhost:9090/ad/test";
 Map<String,Object> params=new HashMap<>();
 params.put("name","qz");
 params.put("age",18);
 Response response = RestTemplateUtil.requestForGet(url,params,Response.class);

注:(1)requestForPost方法中有一行params.forEach(postParams::add);是用Lambda方式将params中的K,V添加到postParams当中,需要JDK8以上支持,否则直接用iterator一个一个迭代添加吧。
(2)requestForPost方法中有一行headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));设置请求头参数类型和字符集,这个加上会报错,需注意,我已经将这一行注释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qzxl

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值