自定义的ClientHttpRequestInterceptor添加到RestTemplate

此篇文章介绍在使用restTemplate访问另一个服务器时,需要在请求头Headers添加某个标识,比如token、sign。当然也可以直接重构restTemplate调用方法,在方法中将参数添加到请求头中;此篇文章是通过拦截HttpRequest,将参数添加请求头中。

1、自定义HeaderRequestInterceptor 

拦截HttpReqeust,并将标识添加到请求头中,相当于存在一个业务处理过程。

import com.ahdhst.commons.webmvc.exception.CommonException;
import com.ahdhst.lzz.lzt25.enums.core.ResultEnum;
import com.ahdhst.lzz.lzt25.properties.ServerSecretProperties;
import com.ahdhst.lzz.lzt25.utils.MapUtils;
import com.ahdhst.lzz.lzt25.utils.SignUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpRequest;
import org.springframework.http.client.ClientHttpRequestExecution;
import org.springframework.http.client.ClientHttpRequestInterceptor;
import org.springframework.http.client.ClientHttpResponse;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.io.IOException;
import java.util.Map;
import java.util.Objects;

/**
 * <p>Description:</p>
 * Created on 2021/7/27 16:33
 *
 **/
@Component
@Slf4j
public class HeaderRequestInterceptor implements ClientHttpRequestInterceptor {

    @Resource
    private ServerSecretProperties serverSecretProperties;

    @Override
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
            throws IOException {
        String sign = null;
        String appId = Objects.requireNonNull(request.getHeaders().get("appId")).get(0);
        Map<String,String> map;
        if (HttpMethod.GET.name().equalsIgnoreCase(Objects.requireNonNull(request.getMethod()).name())) {//地址拼接参数
           String param = request.getURI().getQuery();
           map = MapUtils.getStringToMap(param,"str");
           sign = initSecret(map,appId);
        }else{//参数作为对象
            map = MapUtils.getStringToMap(new String(body),"json");
            sign = initSecret(map,appId);
        }
        HttpHeaders headers = request.getHeaders();
        // 加入自定义字段
        headers.add("sign", sign);

        // 保证请求继续被执行
        return execution.execute(request, body);
    }
}

2、将自定义的HeaderRequestInterceptor 添加到RestTemplate

注意:创建的方法名serverRestTemplate,在引用RestTemplate时,命名规则为以方法名命名。

这样才能将自定义的HeaderRequestInterceptor 有效的添加到RestTemplate中。

import com.ahdhst.lzz.lzt25.interceptor.HeaderRequestInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.Collections;

/**
 * <p>Description:</p>
 * Created on 2021/7/27 16:22
 *
 **/
@Configuration
public class ServerRestTemplateConfig {

    // 注入拦截器。拦截器也可以不声明为Bean, 直接在这里新建实例
    @Resource
    HeaderRequestInterceptor actionTrackInterceptor;

    // 声明为Bean,方便应用内使用同一实例
    @Bean
    public RestTemplate serverRestTemplate() {
        RestTemplate restTemplate = new RestTemplate();
        // 把自定义的ClientHttpRequestInterceptor添加到RestTemplate,可添加多个
        restTemplate.setInterceptors(Collections.singletonList(actionTrackInterceptor));
        return restTemplate;
    }
}

3、重构RestTemplate方法

注意:private RestTemplate serverRestTemplate; 声明规则以上述的方法名一致。

import com.ahdhst.commons.webmvc.exception.CommonException;
import com.ahdhst.lzz.lzt25.enums.core.ResultEnum;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import com.github.pagehelper.PageSerializable;
import org.springframework.http.*;
import org.springframework.stereotype.Service;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.List;

/**
 * <p>Description:</p>
 * Created on 2021/7/29 11:00
 *
 **/
@Service
public class PubRestTemplateUtils {

    @Resource
    private RestTemplate serverRestTemplate;
    /**
     * <p>Description:get请求配置请求头,返回List</p>
     * @param url 地址
     * @param appId 服务器appId
     * @param clazz 类
     * Created on 2021/7/28 21:41
     * @return T
     **/
    public <T> List<T> getForObject(String url,  String appId, Class<T> clazz){
        JSONObject body = getData(appId,url);
        return getForObjectList(body,clazz);
    }

    /**
     * <p>Description:get请求配置请求头,返回对象</p>
     * @param url 地址
     * @param appId 服务器appId
     * @param clazz 类
     * Created on 2021/7/28 21:41
     * @return T
     **/
    public <T> T getForOnlyOneObject(String url, String appId, Class<T> clazz){
        JSONObject body = getData(appId,url);
        return getForOnlyOneData(body,clazz);
    }

    /**
     * <p>Description:post请求配置请求头,返回List</p>
     * @param url 地址
     * @param appId 服务器appId
     * @param clazz 类
     * Created on 2021/7/28 21:41
     * @return T
     **/
    public <T> List<T> postForObject(String url, String appId, Object objcet, Class<T> clazz){
        JSONObject body =postData(appId,url,objcet);
        return getForObjectList(body,clazz);
    }

    /**
     * <p>Description:post请求配置请求头,返回对象</p>
     * @param url 地址
     * @param appId 服务器appId
     * @param clazz 类
     * Created on 2021/7/28 21:41
     * @return T
     **/
    public <T> T postForOnlyOneObject(String url, String appId,Object object,Class<T> clazz){
        JSONObject body =postData(appId,url,object);
        return getForOnlyOneData(body,clazz);
    }

    /**
     * <p>Description:get请求配置请求头,返回分页对象</p>
     * @param url 地址
     * @param appId 服务器appId
     * @param clazz 类
     * Created on 2021/7/28 21:41
     * @return T
     **/
    public <T> PageSerializable<T> getForPageObject(String url, String appId, Class<T> clazz){
        JSONObject body = getData(appId,url);
        return getPageData(body, clazz);
    }

    /**
     * <p>Description: post请求配置请求头,返回分页对象</p>
     * Created on 2021/8/2 10:15
     *
     * @param url 地址
     * @param sign 签名
     * @param obj 对象
     * @param clazz 类
     * @return T
     */
    public <T> PageSerializable<T> postForPageObject(String url, String sign, Object obj, Class<T> clazz){
        JSONObject body =postData(sign,url, obj);
        return getPageData(body, clazz);
    }

    /**
     * <p>Description:处理返回数据,返回对象</p>
     * @param body 返回数据
     * @param clazz 返回对象
     * Created on 2021/8/6 10:13
     * @return T
     **/
    private <T> T getForOnlyOneData(JSONObject body, Class<T> clazz) {
        if(null != body && body.get("code").equals(Constants.ONE)){
            return body.getObject("data",clazz);
        }else{
            assert body != null;
            String msg = body.get("msg").toString();
            throw new CommonException(ResultEnum.ERROR_SERVER_EXCEPTION,msg);
        }
    }

    /**
     * <p>Description:处理返回数据,返回对象list</p>
     * @param body 响应数据
     * @param clazz 返回类型
     * Created on 2021/8/6 10:11
     * @return java.util.List<T>
     **/
    private <T> List<T> getForObjectList(JSONObject body, Class<T> clazz) {
        if(null != body && body.get("code").equals(Constants.ONE)){
            JSONArray jsonArray = body.getJSONArray("data");
            return JSON.parseArray(JSON.toJSONString(jsonArray),clazz);
        }else{
            assert body != null;
            String msg = body.get("msg").toString();
            throw new CommonException(ResultEnum.ERROR_SERVER_EXCEPTION,msg);
        }
    }



    /**
     * <p>Description: 处理返回分页数据</p>
     * Created on 2021/8/2 10:18
     *
     * @param body 返回
     * @return T
     */
    private <T> PageSerializable<T> getPageData(JSONObject body, Class<T> clazz) {
        if(null != body && body.get("code").equals(Constants.ONE)){
            JSONObject data = body.getObject("data",JSONObject.class);
            List<T> list = JSON.parseArray(JSON.toJSONString(data.getJSONArray("list")), clazz);
            PageSerializable<T> pageSerializable = new PageSerializable<>(list);
            long total = data.getObject("total",long.class);
            pageSerializable.setTotal(total);
            return pageSerializable;
        }else{
            assert body != null;
            String msg = body.get("msg").toString();
            throw new CommonException(ResultEnum.ERROR_SERVER_EXCEPTION,msg);
        }
    }

    /**
     * <p>Description:请求头设置;调转外部服务器获取数据</p>
     * @param appId 服务器
     * @param url 访问地址
     * Created on 2021/7/30 11:33
     * @return com.alibaba.fastjson.JSONObject
     **/
    private JSONObject getData(String appId,String url){
        // 请求头设置
        HttpHeaders headers = new HttpHeaders();
        headers.set("appId",appId);
        // 组装请求体
        HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(null,headers);
        ResponseEntity<JSONObject> exchange = serverRestTemplate.exchange(url, HttpMethod.GET, request, JSONObject.class);
        return exchange.getBody();
    }

    /**
     * <p>Description:请求头设置;调转外部服务器获取数据</p>
     * @param appId 服务器
     * @param url 访问地址
     * Created on 2021/7/30 11:33
     * @return com.alibaba.fastjson.JSONObject
     **/
    private JSONObject postData(String appId,String url,Object object){
        // 请求头设置
        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_JSON);
        headers.set("appId",appId);
        // 组装请求体
        HttpEntity<Object> request = new HttpEntity<>(object,headers);
        return serverRestTemplate.exchange(url, HttpMethod.POST, request,JSONObject.class,object).getBody();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值