RestTemplate设置通用header 并获取header请求参数

在开发项目过程中,使用的架构 springboot + vue,但java项目又拆分成一个基础授权(base)项目,一个获取授权(auth)项目,还有两个业务系统。此时需要通过auth项目去获取base项目的授权信息。因此使用了springboot的RestTemplate来实现不同项目之间的访问。但是在base项目中,安全起见增加了请求拦截器,此时获取header成了问题。搜索了很多的帖子,终于在今天解决掉了,现在把实现方案记录下来。

请求方

增加interceptor

public static class UserAgentInterceptor implements ClientHttpRequestInterceptor {
 
        @Override
        public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
            HttpHeaders headers = request.getHeaders();
            // 这种方案我没有实现成功,所以用的自定义字段
            // headers.add(HttpHeaders.USER_AGENT, "your agent");
            headers.add("customer_agent", "your agent");
            return execution.execute(request, body);
        }
    }

设置interceptor 

@Bean
    public RestTemplate restTemplate() {
        HttpComponentsClientHttpRequestFactory httpRequestFactory = new HttpComponentsClientHttpRequestFactory();
        httpRequestFactory.setConnectionRequestTimeout(CONN_TIMEOUT_IN_MILLIS);
        httpRequestFactory.setConnectTimeout(CONN_TIMEOUT_IN_MILLIS);
        httpRequestFactory.setReadTimeout(READ_TIMEOUT_IN_MILLIS);
 
        RestTemplate restTemplate = new RestTemplate();
        restTemplate.getMessageConverters()
                .add(0, new StringHttpMessageConverter(Charset.forName("UTF-8")));
        restTemplate.setInterceptors(Collections.singletonList(new UserAgentInterceptor()));
        return restTemplate;
    }

服务方

获取自定义的header

Enumeration<String> headerNames = request.getHeaderNames();
while (headerNames.hasMoreElements()) {
String key = (String) headerNames.nextElement();
String value = request.getHeader(key);

 

`restTemplate.exchange`是Spring框架中的一个HTTP客户端工具,用于发送HTTP请求和接收HTTP响应。 如果您要使用`restTemplate.exchange`方法发送带有JSON请求正文的POST请求且接收JSON响应,可以像下面这样编写代码: ```java RestTemplate restTemplate = new RestTemplate(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); String requestBody = "{\"key\":\"value\"}"; // JSON请求正文 HttpEntity<String> requestEntity = new HttpEntity<>(requestBody, headers); URI uri = new URI("http://example.com/api/endpoint"); // 请求的URI ResponseEntity<String> responseEntity = restTemplate.exchange( uri, HttpMethod.POST, requestEntity, String.class); String responseBody = responseEntity.getBody(); // 响应正文 ``` 在上面的代码中,我们首先创建了一个`RestTemplate`实例,然后创建了一个`HttpHeaders`对象将其设置为JSON格式。接着,我们构建了一个包含JSON请求正文的`HttpEntity`对象,将其传递给`restTemplate.exchange`方法。此外,我们还指定了请求的HTTP方法类型和请求的URI。 最后,我们从`ResponseEntity`对象中获取了响应的JSON正文。 请注意,上述代码中的JSON请求正文和响应正文都是以字符串的形式进行处理的。如果您想使用Java对象来表示JSON请求和响应,您需要使用一个JSON解析库,例如Jackson或Gson。您可以在`RestTemplate`中配置一个`HttpMessageConverter`来处理JSON格式的请求和响应。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值