RestTemplate请求及初始化

参考资料:
https://www.jianshu.com/p/f3d0b4be5524

POST请求

  @Test
    public void test() {
    
    
        String url = "http://192.168.1.16:8080/api/inner/coupon/getCouponTljs";
        // 设置请求的 Content-Type 为 application/json
        MultiValueMap<String, String> header = new LinkedMultiValueMap();
        header.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(MediaType.APPLICATION_JSON_VALUE));
// 设置 Accept 向服务器表明客户端可处理的内容类型
        header.put(HttpHeaders.ACCEPT, Arrays.asList(MediaType.APPLICATION_JSON_VALUE));
// 直接将实体 Product 作为请求参数传入,底层利用 Jackson 框架序列化成 JSON 串发送请求
        HttpEntity<CouponTljReq> request = new HttpEntity<>(new CouponTljReq("shopping", "saveMoney", 1, 10));
        ResponseEntity<CouponTljResp[]> exchangeResult = restTemplate.exchange(url, HttpMethod.POST, request, CouponTljResp[].class);
        CouponTljResp[] body = exchangeResult.getBody();
        System.out.println("post_product2: " + exchangeResult);
    }

POST请求指定接收实体

 MultiValueMap<String, String> header = new LinkedMultiValueMap();
        header.put(HttpHeaders.CONTENT_TYPE, Arrays.asList(MediaType.APPLICATION_JSON_VALUE));
        // 设置 Accept 向服务器表明客户端可处理的内容类型
        header.put(HttpHeaders.ACCEPT, Arrays.asList(MediaType.APPLICATION_JSON_VALUE));
        // 直接将实体 Product 作为请求参数传入,底层利用 Jackson 框架序列化成 JSON 串发送请求
        HttpEntity<SignOpenPacketReq> request = new HttpEntity<>(new SignOpenPacketReq(appName, String.valueOf(user.getUserId()), user.getChannel()));
        ResponseEntity<BaseResult<SignInPacket>> exchange = restTemplate.exchange(url, HttpMethod.POST, request, new ParameterizedTypeReference<BaseResult<SignInPacket>>() {
    
    
        });
        BaseResult result = exchange.getBody();
		Map<String,Object> params = new HashMap<>();
        params.put("skuId",skuId);
        params.put("userId",userId);
        params.put("appName",appName);
        Long result = restTemplate.postForObject(url, params,Long.class);

GET请求

  String url = goodsServerUrl + "/exchange/round/recreation";
        RoundTljResp[] roundTljResps = restTemplate.getForObject(url, RoundTljResp[].class);

初始化RestTemplate

import org.apache.commons.lang3.StringUtils;
import org.slf4j.MDC;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.http.HttpHeaders;
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.web.client.ResponseErrorHandler;
import org.springframework.web.client.RestTemplate;

import java.io.IOException;

@Configuration
public class RestTemplateConfiguration {
    
    

    @Bean
    public RestTemplate restTemplate(RestTemplateBuilder builder) {
    
    

        RestTemplate restTemplate = builder.build();

        // RestTemplate支持traceId传递
        ClientHttpRequestInterceptor tracerInterceptor = new ClientHttpRequestInterceptor() {
    
    
            @Override
            public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution) throws IOException {
    
    
                HttpHeaders headers = request.getHeaders();
                String traceId = MDC.get(TraceMarkRequestListener.MDC_KEY_TRACE_ID);
                if (StringUtils.isNotBlank(traceId)) {
    
    
                    headers.add("x-request-id", traceId);
                }
                return execution.execute(request, body);
            }
        };
        restTemplate.getInterceptors().add(tracerInterceptor);

        return restTemplate;
    }
}
import lombok.extern.slf4j.Slf4j;
import org.slf4j.MDC;
import org.springframework.stereotype.Component;

import javax.servlet.ServletRequest;
import javax.servlet.ServletRequestEvent;
import javax.servlet.ServletRequestListener;
import javax.servlet.http.HttpServletRequest;
import java.util.Enumeration;
import java.util.UUID;

@Slf4j
@Component
public class TraceMarkRequestListener implements ServletRequestListener {
    
    

    public static final String MDC_KEY_TRACE_ID = "traceId";

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
    
    
        ServletRequest request = sre.getServletRequest();
        if (request instanceof HttpServletRequest) {
    
    
            HttpServletRequest httpRequest = (HttpServletRequest) request;
            String xRequestId = httpRequest.getHeader("x-request-id");
            if (xRequestId == null) {
    
    
                xRequestId = UUID.randomUUID().toString().replace("-", "").toLowerCase();
            }
            MDC.put(MDC_KEY_TRACE_ID, xRequestId);
        }
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
    
    
        MDC.remove(MDC_KEY_TRACE_ID);
    }

    private String getRequestHeaderInfo(HttpServletRequest request) {
    
    
        StringBuilder builder = new StringBuilder();
        Enumeration<String> names = request.getHeaderNames();
        while (names.hasMoreElements()) {
    
    
            String name = names.nextElement();
            builder.append("[").append(name).append(":").append(request.getHeader(name)).append("],");
        }
        return builder.toString();
    }
}

猜你喜欢

转载自blog.csdn.net/My_Way666/article/details/106719227