springboot Http交互后端模板

@Service
@Slf4j
@Profile("xxxxx")
public class MesHttpRestTemplate {
    
    private final RestTemplate restTemplate;public MesHttpRestTemplate(RestTemplate restTemplate) {
        this.restTemplate = restTemplate;
    }

    @Async
    public void sendByHttp(SendInfo sendInfo) {

        log.info("requestLsExit body:{}", sendInfo);
        ResponseBean responseBean = this.postRequest(sendInfo.getUrl(), sendInof, ResponseBean.class);
        log.info("requestLsExit McsResponse:{}", responseBean);
    }

    /**
     * http POST请求
     *
     * @param api   非空,api资源访问路径,即( /path1/path2 ),不包含IP部分
     * @param id    待替换api中的{id}的值
     * @param body  post请求内容
     * @param clazz 非空,返回类型
     * @return 返回response body, 异常上层处理
     * @throws BusinessException
     */
    <T> T postRequest(String api, String id, Object body, Class<T> clazz) {
        Objects.requireNonNull(api);
        Objects.requireNonNull(clazz);
        api = api.trim();

        if (StringUtils.isNotEmpty(id)) {
            api = api.replace(FmsApiConstant.ID, id);
        }

        try {
            try {
                return restTemplate.exchange(api, HttpMethod.POST, new HttpEntity<>(body, getHeaders()), clazz).getBody();
            } catch (ResourceAccessException e) {
                log.warn("Cannot access mes, please check network or url {}", e.toString());
                synchronized (this) {
                    try {
                        this.wait(3000);
                    } catch (InterruptedException ex) {
                        // ignore
                    }
                }
                // 连接失败时,重试一次
                return restTemplate.exchange(api, HttpMethod.POST, new HttpEntity<>(body, getHeaders()), clazz).getBody();
            }
        } catch (ResourceAccessException e) {
            //无法连接
        } catch (RestClientException e) {
        //访问出错
        }
    }

    /**
     * http POST请求 重载方法
     *
     * @param api
     * @param body
     * @param clazz
     * @param <T>
     * @return
     */
    public <T> T postRequest(String api, Object body, Class<T> clazz) {
        return postRequest(api, null, body, clazz);
    }


    /**
     * 获取报文头信息
     *
     * @return
     */
    private HttpHeaders getHeaders() {
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_TYPE, "application/json");
        return headers;
    }

}

ResponseBean

/**
 * @ClassName ResponseBean
 * @Description 操作成功返回实体
 **/
@Data public class ResponseBean<T> { private int code; private String msg; private T data; public ResponseBean(){}; public static ResponseBean success() { return new ResponseBean(200, "success"); }public static <T> ResponseBean success(T data) { return new ResponseBean<>(200, null, data); } }

 

posted @ 2022-02-21 15:12  黄易安  阅读(118)  评论(0)    收藏  举报