欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

SpringBoot使用RestTemplate发起GET和POST请求

程序员文章站 2022-05-23 10:22:29
...

不说废话,先贴代码:

网上好多代码放到自己机器上错误一大堆,今天刚好有空就自己写了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) throws Exception{
        HttpHeaders headers = new HttpHeaders();
        headers.add("Accept", "application/json");
        //headers.setContentType(MediaType.parseMediaType("application/json; charset=UTF-8"));
        MultiValueMap<String, Object> postParams = new LinkedMultiValueMap<>();
        params.forEach(postParams::add);
        HttpEntity<MultiValueMap<String, Object>> requestEntity = new HttpEntity<>(postParams, headers);
        ResponseEntity<T> response = null;
        try {
            response = request.exchange(url, HttpMethod.POST, requestEntity, clazz);
        } catch (Exception e) {
            throw new Exception("资源链接访问异常");
        }
        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方式,有参数:

 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方式,有参数,这个与(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"));设置请求头参数类型和字符集,这个加上会报错,需注意,我已经将这一行注释。

相关标签: 问题 spring