RestTemplate使用实战(二)-复杂多层嵌套对象的处理和封装

RestTemplate是什么

RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。

为什么要用RestTemplate

相信大家之前都用过apache的HTTPClient类,逻辑繁琐,代码复杂,还要自己编写使用类HttpClientUtil,封装对应的post,get,delete等方法。

RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。RestTemplate提供更高等级的符合HTTP的六种主要方法,可以很简单的调用RESTful服务。

RestTemplate实战

一.创建RestTemplate

创建RestTemplate很简单,只需要把RestTemplate注入到bean里面。

@Configuration public class RestTempleConfig { @Bean public RestTemplate restTemplate ( ) { return new RestTemplate ( ) ;

当然,也可以通过xml文件配置的方式注入。
默认情况下RestTemplate自动帮我们注册了一组HttpMessageConverter用来处理一些不同的contentType的请求。如果现有的转换器不能满足你的需求,你还可以实现org.springframework.http.converter.HttpMessageConverter接口自己写一个。详情参考
官方api
其他相关的配置,也可以在官方文档中查看。当然,对于一个请求来说,超期时间,请求连接时间等都是必不可少的参数,为了更好的适应业务需求,所以可以自己修改restTemplate的配置。

* 替代默认的SimpleClientHttpRequestFactory * 设置超时时间重试次数 * 同时设置一些拦截器以便监控 * @return @Bean public RestTemplate restTemplate ( ) { //生成一个设置了连接超时时间、请求超时时间、异常重试次数3次 RequestConfig config = RequestConfig . custom ( ) . setConnectionRequestTimeout ( 10000 ) . setConnectTimeout ( 10000 ) . setSocketTimeout ( 30000 ) . build ( ) ; HttpClientBuilder builder = HttpClientBuilder . create ( ) . setDefaultRequestConfig ( config ) . setRetryHandler ( new DefaultHttpRequestRetryHandler ( 3 , false ) ) ; HttpClient httpClient = builder . build ( ) ; ClientHttpRequestFactory requestFactory = new HttpComponentsClientHttpRequestFactory ( httpClient ) ; RestTemplate restTemplate = new RestTemplate ( requestFactory ) ; //做个日志拦截器;从性能上考虑,当前屏蔽该功能 //restTemplate.setInterceptors(Collections.singletonList(new RestTemplateConsumerLogger())); return restTemplate ;

二.RestTemplate使用

RestTemplate提供了六种常用的HTTP方法实现远程服务调用,RestTemplate的方法名遵循一定的命名规范,第一部分表示用哪种HTTP方法调用(get,post),第二部分表示返回类型。

getForObject – 发送GET请求,将HTTP response转换成一个指定的object对象
postForEntity – 发送POST请求,将给定的对象封装到HTTP请求体,返回类型是一个HttpEntity对象
每个HTTP方法对应的RestTemplate方法都有3种。其中2种的url参数为字符串,URI参数变量分别是Object数组和Map,第3种使用URI类型作为参数
exchange 和execute 方法比上面列出的其它方法(如getForObject、postForEntity等)使用范围更广,允许调用者指定HTTP请求的方法(GET、POST、PUT等),并且可以支持像HTTP PATCH(部分更新)。

这次主要讲的是exchange 方法的使用。
exchange(String url, HttpMethod method,@Nullable HttpEntity<?> requestEntity, Class responseType, Map

参数说明:
url:请求路径
method:请求的方法(GET、POST、PUT等)
requestEntity:HttpEntity对象,封装了请求头和请求体
responseType:返回数据类型
uriVariables:支持PathVariable类型的数据。

创建一个RestTemplate连接

    private String getId(String id) {
        String url = RemoteUrl + "/id";
        //设置Http的Header
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
		//设置访问参数
        HashMap<String, Object> params = new HashMap<>();
        params.put("name", name);
		//设置访问的Entity
        HttpEntity entity = new HttpEntity<>(params, headers);
        ResponseEntity<String> result = null;
        try {
        	//发起一个POST请求
            result = restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
            JSONObject data = JSONObject.parseObject(result.getBody()).getJSONObject("data");
            return data.getString("id");
        } catch (Exception e) {
            logger.error("获取id失败: " + e.getMessage());
        return null;

当然也可以写一个通用的工具类,根据传入的参数来确定请求的路径和内容。工具类肯定是想通过静态方式来直接调用,而不是通过new Util()的方式来使用。但是静态变量/类变量不是对象的属性,而是一个类的属性,spring则是基于对象层面上的依赖注入。

所以我们不能@Autowired或者@resource一个静态变量,使之成为一个spring bean。但是静态方法又不能调用非静态的属性,那么我们该怎么办呢?

@Component
public class HttpUtil {
    private static Logger logger = LoggerFactory.getLogger(HttpUtil.class);
    @Resource
    private RestTemplate restTemplate;
    private static HttpUtil httpUtil;
    @PostConstruct
    public void init(){
        httpUtil = this;
        httpUtil.restTemplate = this.restTemplate;
    public static <T> String httpRequest(String url, HttpMethod method, HttpEntity<T> entity){
        try {
            //发起一个POST请求
            ResponseEntity<String> result = httpUtil.restTemplate.exchange(url, HttpMethod.POST, entity, String.class);
           return result.getBody();
        } catch (Exception e) {
            logger.error("请求失败: " + e.getMessage());
        return null;

这个时候我们就需要维护一个工具类的静态实例,初始化的时候把restTemplate传进来,这样就可以直接调用HttpUtil.httpRequest()方法。

最后编写controller类,用我们的exchange方法远程调用,就能获取到结果了。一般来说,拿到的结果是一个json类型,我们还需要通过fastjson,Jackson等来处理我们的json字符串,获取到我们想要的数据。

RestTemplate是什么RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。为什么要用RestTemplate相信大家之前都用过apache的HTTPClient类,逻辑繁琐,代码复杂,还要自己编写使用类HttpClientUtil,封装对应的post,get,delete等方法。Rest... 可用于园艺,小型房屋停车等的站点数据库 添加后院记录 L x W agriok现有宜居现有固定器uppertinhouseok buildok后院入口宽度shareproduce共享服务费描述 在x匹配查询中 RestTemplate是什么 RestTemple是Spring提供的用于访问Http请求的客户端,RestTemple提供了多种简洁的远程访问服务的方法,省去了很多无用的代码。 为什么要用RestTemplate 相信大家之前都用过apache的HTTPCl... @Bean public RestTemplate restTemplate(ClientHttpRequestFactory factory){ RestTemplate restTemplate = new RestTemplate(factory); // 支持中文编码 restTemplate.getMess
1、什么是RestTemplate RestTemple是Spring提供的用于访问Http请求的客户端; 相对于apache的HTTPClient类,逻辑繁琐,代码复杂,还要自己编写使用类HttpClientUtil,封装对应的post,get,delete等方法RestTemplate可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。RestTemplate提供更高等级的符合HTTP的六种主要方法,可以很
1.Post请求 post请求需要用LinkedMultiValueMap来传递参数 String url = “https://xx.xx.com/app/order/getNumber”; MultiValueMap<String, Object> paramMap = new LinkedMultiValueMap<String, Object>(); paramMap.add(“name”, “name”);
为什么要用RestTemplate?? 相信大家之前都用过apache的HTTPClient类,逻辑繁琐,代码复杂,还要自己编写使用类HttpClientUtil,封装对应的post,get,delete等方法RestTemplate的行为可以通过callback回调方法和配置HttpMessageConverter 来定制,用来把对象封装到HTTP请求体,将响应信息放到一个对象中。Rest...
RestTemplate发送请求得到非200状态结果的时候,间隔一定的时间再次发送n次请求。n次请求都失败之后,最后抛出HttpClientErrorException。 在开始本节代码之前,将上一节的RestTemplate自定义异常处理的代码注释掉,否则自动重试机制不会生效。
异常抛出之后,程序后面的代码就执行不到了,无法进行后面的代码执行。实际的业务开发中,有的时候我们更期望的结果是:不管你服务端是超时了还是服务不存在,我们都应该获得最终的请求结果(HTTP请求结果状态400、500),而不是获得一个抛出的异常。 二、源码解析-默认实现 首先我要说一个结论:RestTemplate请求结果异常是可以自定义处理的。在开始进行自定义的异常处理逻辑之前,我们有必要看一下异常处理的默认实现。也就是:为什么会产生上面小节提到的现象? ResponseErrorHandler是RestTemplate请求结果的异常处理器接口 o接口的第一个方法hasError用于判断HttpResponse是否是异常响应(通过状态码) o接口的第二个方法handleError用于处理异常响应结果(非200状态码段) DefaultResponseErrorHandler是ResponseErrorHandler的默认实现
```java RestTemplate restTemplate = new RestTemplate(); String url = "http://example.com/api/getData?id=123"; HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); HttpEntity<?> requestEntity = new HttpEntity<>(headers); ResponseEntity<String> responseEntity = restTemplate.exchange( HttpMethod.GET, requestEntity, String.class); String response = responseEntity.getBody(); 在这个例子中,我们使用 `RestTemplate` 创建了一个 GET 请求。我们指定了请求 URL,并设置了一个 `Accept` 头部,表明我们想要 JSON 格式的响应。然后我们创建了一个 `HttpEntity` 对象,包含了我们的头部信息。最后,我们使用 `exchange` 方法发送请求,并将响应转化为一个 `String` 类型的对象。
热爱Java,热爱生活: [code=java] org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'testController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'lidahu.nacos' in value "${lidahu.nacos}" at org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor.postProcessProperties(AutowiredAnnotationBeanPostProcessor.java:405) ~[spring-beans-5.3.3.jar:5.3.3] [/code] RestTemplate使用实战-exchange方法讲解 打破砂锅问到底007: java的 RestTemplate中的exchange()方法 允许指定 post, get等方法,比 execute()方法应用更广