在实际开发中,很多情况下都需要调用不同项目的接口。此时可以用RestTemplate进行调用。本例以Spring Boot下使用RestTemplate为例。

RestTemplate有三个构造器,可以根据需要使用不同的构造器。

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。
public RestTemplate() {...}
public RestTemplate(ClientHttpRequestFactory requestFactory) {
this();
this.setRequestFactory(requestFactory);
}
public RestTemplate(List<HttpMessageConverter<?>> messageConverters) {
this.messageConverters = new ArrayList();
this.errorHandler = new DefaultResponseErrorHandler();
this.headersExtractor = new RestTemplate.HeadersExtractor();
Assert.notEmpty(messageConverters, "At least one HttpMessageConverter required");
this.messageConverters.addAll(messageConverters);
this.uriTemplateHandler = initUriTemplateHandler();
}
 

根据需要创建Bean实例,采用SimpleClientHttpRequestFactory的方式。可以设置连接超时时间等信息

package com.study.config;

import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.client.SimpleClientHttpRequestFactory;
import org.springframework.web.client.RestTemplate;

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Config {
    @Bean
    public RestTemplate restTemplate(){
        SimpleClientHttpRequestFactory requestFactory = new SimpleClientHttpRequestFactory();
        requestFactory.setConnectTimeout(100000);
        requestFactory.setReadTimeout(100000);
        RestTemplate restTemplate = new RestTemplate(requestFactory);
        return restTemplate;
    }
}

设置接口的请求地址及方法名(只测试常用的两种请求get和post)

请求地址常用有以下几种方式

GET请求:

  /get_products?name=aa&code=aa123

  /get_products

  /get_product_details/{code}

POST请求:

  /update_product

package com.study.common;

public class Constants {
    public final static String requestUrl = "http://localhost:8080/rest";
    public final static String GET_PRODUCTS = "/get_products";
    public final static String GET_PRODUCT_DETAILS = "/get_product_details/{code}";
    public final static String UPDATE_PRODUCTS = "/update_product";
}

创建RestUtils工具类。RestUtils.request(String url, Map<String,Object> params, HttpMethod httpMethod)方法调用。后面会说明params及url传递的方式

package com.study.utils;

import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.*;
import org.springframework.util.MimeType;
import org.springframework.util.MimeTypeUtils;
import org.springframework.web.client.RestTemplate;

import java.util.Map;
import java.util.Set;

public class RestUtils<T> {
    private RestTemplate restTemplate;

    public RestUtils() {
        super();
    }

    public RestUtils(RestTemplate restTemplate) {
        super();
        this.restTemplate = restTemplate;
    }

    public ServiceResponse<T> request(String url, Map<String, Object> params, HttpMethod httpMethod) {
        ServiceResponse<T> serviceResponse = new ServiceResponse<>();
        try {
            HttpHeaders headers = new HttpHeaders();
            MimeType mimeType = MimeTypeUtils.parseMimeType("application/json");
            MediaType mediaType = new MediaType(mimeType.getType(), mimeType.getSubtype());
            headers.setContentType(mediaType);
            HttpEntity<Object> entity = null;
            if (params == null) {
                entity = new HttpEntity<>(headers);
            } else {
                if (params.containsKey("data")) {
                    entity = new HttpEntity<>(params.get("data"), headers);
                    params.remove("data");
                } else {
                    entity = new HttpEntity<>(params, headers);
                }
            }
            ResponseEntity<T> responseEntity = null;
            if (params == null || params.isEmpty()) {
                responseEntity = restTemplate.exchange(url, httpMethod, entity, new ParameterizedTypeReference<T>() {
                });
            } else {
                responseEntity = restTemplate.exchange(expandURL(url, params.keySet()), httpMethod, entity, new ParameterizedTypeReference<T>() {
                }, params);
            }
            serviceResponse.setResult(responseEntity.getBody());
        } catch (Exception e) {
            e.printStackTrace();
            serviceResponse.setCode(500);
            serviceResponse.setDescription(e.getMessage());
        }
        return serviceResponse;
    }

    private String expandURL(String url, Set<?> keys) {
        StringBuffer sb = new StringBuffer(url);
        if (url.indexOf("?") > 0) {
            sb.append("&");
        } else {
            sb.append("?");
        }
        for (Object key : keys) {
            sb.append(key).append("=").append("{").append(key).append("}")
                    .append("&");
        }
        return sb.deleteCharAt(sb.length() - 1).toString();
    }
}

 

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄