All Downloads are FREE. Search and download functionalities are using the official Maven repository.

net.polyv.live.v1.service.LiveBaseService Maven / Gradle / Ivy

The newest version!
package net.polyv.live.v1.service;

import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.alibaba.fastjson.JSON;

import lombok.extern.slf4j.Slf4j;
import net.polyv.common.v1.base.HttpUtil;
import net.polyv.common.v1.constant.Constant;
import net.polyv.common.v1.exception.PloyvSdkException;
import net.polyv.common.v1.util.MapUtil;
import net.polyv.common.v1.util.SDKValidateUtil;
import net.polyv.common.v1.util.StringUtils;
import net.polyv.common.v1.validator.ViolationMsg;
import net.polyv.live.v1.config.LiveGlobalConfig;
import net.polyv.live.v1.constant.LiveURL;
import net.polyv.live.v1.entity.LiveCommonRequest;
import net.polyv.live.v1.entity.LiveCommonResponse;
import net.polyv.live.v1.util.LiveSignUtil;

/**
 * 直播公共服务类
 * @author: sadboy
 **/
@Slf4j
public class LiveBaseService {
    public static final String ERROR_PREFIX = "保利威HTTP错误,请求流水号:";
    public static final String ERROR_INFO = " ,错误原因: ";
    public static final String ERROR_SUFFIX = " ,错误原因: 服务器接口未返回任何数据";
    public static final String ERROR_PREFIX1 = "保利威请求返回数据错误,请求流水号:";
    
    /**
     * GET service开始
     */
    
    /**
     * HTTP GET 获取返回对象
     * @param url 请求URL
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T getReturnOne(String url, E e, Class tClass)
            throws IOException, NoSuchAlgorithmException {
        return this.baseGet(url, e).parseData(tClass);
    }
    
    /**
     * HTTP GET 获取返回数组
     * @param url 请求URL
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  List getReturnList(String url, E e, Class tClass)
            throws IOException, NoSuchAlgorithmException {
        return this.baseGet(url, e).parseArray(tClass);
    }
    
    /**
     * HTTP GET 公共请求
     * @param url 请求URL
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  LiveCommonResponse baseGet(String url, E e)
            throws IOException, NoSuchAlgorithmException {
        Map paramMap = commonRequestLogic(null, e);
        url = appendProtocol(url);
        String response = HttpUtil.get(url, paramMap, getHttpHeadMap());
        return responseConversion(response, e.getRequestId());
    }
    
    /**
     * HTTP GET 获取文件二进制
     * @param url 请求URL
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return 文件二进制流
     * @throws IOException 异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  byte[] getReturnBinary(String url, E e)
            throws IOException, NoSuchAlgorithmException {
        Map paramMap = commonRequestLogic(null, e);
        url = appendProtocol(url);
        byte[] response = HttpUtil.getBinary(url, paramMap, getHttpHeadMap(), null);
        if (response == null) {
            String message = ERROR_PREFIX + e.getRequestId() + ERROR_SUFFIX;
            PloyvSdkException exception = new PloyvSdkException(Constant.ERROR_CODE, message);
            log.error(message, exception);
            throw exception;
        }
        return response;
    }
    
    /**
     * GET service结束
     */
    
    /**
     * POST service开始
     */
    
    /**
     * HTTP POST 获取返回对象
     * @param url 请求URL
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T postFormBodyReturnOne(String url, E e, Class tClass)
            throws IOException, NoSuchAlgorithmException {
        return this.basePostFormBody(url, e).parseData(tClass);
    }
    
    /**
     * HTTP POST 获取返回对象 参数通过url提交
     * @param url 请求URL
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T postEmptyFormBodyReturnOne(String url, E e, Class tClass)
            throws IOException, NoSuchAlgorithmException {
        return this.basePostEmptyFormBody(url, e).parseData(tClass);
    }
    
    /**
     * HTTP POST 回去返回数组
     * @param url 请求URL
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装List对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  List postFormBodyReturnList(String url, E e, Class tClass)
            throws IOException, NoSuchAlgorithmException {
        return this.basePostFormBody(url, e).parseArray(tClass);
    }
    
    /**
     * HTTP POST 公共请求
     * @param url 请求URL
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  LiveCommonResponse basePostFormBody(String url, E e)
            throws IOException, NoSuchAlgorithmException {
        Map paramMap = commonRequestLogic(null, e);
        url = appendProtocol(url);
        //兼容新版V4接口
        if (url.contains("/live/v4/")) {
            url = MapUtil.appendUrl(url, paramMap);
        }
        String response = HttpUtil.postFormBody(url, paramMap, getHttpHeadMap());
        return responseConversion(response, e.getRequestId());
    }
    
    /**
     * HTTP POST 公共请求 参数通过url提交
     * @param url 请求URL
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  LiveCommonResponse basePostEmptyFormBody(String url, E e)
            throws IOException, NoSuchAlgorithmException {
        Map paramMap = commonRequestLogic(null, e);
        url = appendProtocol(url);
        url = MapUtil.appendUrl(url, paramMap);
        String response = HttpUtil.postFormBody(url, null, getHttpHeadMap());
        return responseConversion(response, e.getRequestId());
    }
    
    /**
     * HTTP POST 请求发送json
     * @param url 请求URL
     * @param signMap 需要签名的map
     * @param e 请求参数对象
     * @param json json参数
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  List postJsonBodyReturnList(String url, Map signMap,
            E e, String json, Class tClass) throws IOException, NoSuchAlgorithmException {
        return this.basePostJsonBody(url, signMap, e, json).parseArray(tClass);
    }
    
    /**
     * HTTP POST 请求发送json,默认使用appId,timestamp,sign,requestId的 map 集合进行签名
     * @param url 请求URL
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T postJsonBodyReturnOne(String url, E e, Class tClass)
            throws IOException, NoSuchAlgorithmException {
        Map signMap = LiveSignUtil.getSignMap(e);
        return basePostJsonBody(url, signMap, e, "").parseData(tClass);
    }
    
    /**
     * HTTP POST 请求发送json
     * @param url 请求URL
     * @param signMap 需要签名的map
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T postJsonBodyReturnOne(String url, Map signMap, E e,
            Class tClass) throws IOException, NoSuchAlgorithmException {
        return this.basePostJsonBody(url, signMap, e, "").parseData(tClass);
    }
    
    /**
     * HTTP POST 请求发送json
     * @param url 请求URL
     * @param signMap 需要签名的map
     * @param e 请求参数对象
     * @param json json参数
     * @param tClass 返回对象class类型
     * @param  返回对象泛型
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T postJsonBodyReturnOne(String url, Map signMap,
            E e, String json, Class tClass) throws IOException, NoSuchAlgorithmException {
        return this.basePostJsonBody(url, signMap, e, json).parseData(tClass);
    }
    
    /**
     * HTTP POST 请求发送json
     * @param url 请求URL
     * @param signMap 需要签名的map
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  LiveCommonResponse basePostJsonBody(String url, Map signMap,
            E e, String json) throws IOException, NoSuchAlgorithmException {
        signMap = commonRequestLogic(signMap, e);
        url = MapUtil.appendUrl(url, signMap);
        if (StringUtils.isBlank(json)) {
            json = JSON.toJSONString(e);
        }
        url = appendProtocol(url);
        String response = HttpUtil.postJsonBody(url, getHttpHeadMap(), json, null);
        return responseConversion(response, e.getRequestId());
    }
    
    /**
     * POST service开始
     */
    
    /**
     * 上传文件service开始
     */
    
    /**
     * HTTP POST 上传文件公共请求
     * @param url 请求URL
     * @param fileMap 文件MAP,key为服务器接收的名字,value 为File对象
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  请求参数泛型
     * @param  返回数据泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  T uploadOneFile(String url, E e, Map fileMap,
            Class tClass) throws IOException, NoSuchAlgorithmException {
        return this.uploadOneFile(url, e, fileMap).parseData(tClass);
    }
    
    /**
     * HTTP POST 上传文件公共请求
     * @param url 请求URL
     * @param fileMap 文件MAP,key为服务器接收的名字,value 为File对象
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  LiveCommonResponse uploadOneFile(String url, E e, Map fileMap)
            throws IOException, NoSuchAlgorithmException {
        Map paramMap = commonRequestLogic(null, e);
        Map reqMap = new HashMap<>();
        reqMap.put("requestId", e.getRequestId());
        url = MapUtil.appendUrl(url, reqMap);
        url = appendProtocol(url);
        String response = HttpUtil.postFile(url, paramMap, fileMap, getHttpHeadMap(), null);
        return responseConversion(response, e.getRequestId());
    }
    
    /**
     * HTTP POST 上传文件公共请求
     * @param url 请求URL
     * @param fileMap 文件MAP,key为服务器接收的名字,value 为File对象
     * @param e 请求参数对象
     * @param tClass 返回对象class类型
     * @param  请求参数泛型
     * @param  返回数据泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected  List uploadMultipartFile(String url, E e,
            Map> fileMap, Class tClass) throws IOException, NoSuchAlgorithmException {
        return this.uploadMultipartFile(url, e, fileMap).parseArray(tClass);
    }
    
    /**
     * HTTP POST 批量上传文件公共请求
     * @param url 请求URL
     * @param e 请求参数对象
     * @param fileMap 多文件文件MAP,key为服务器接收的名字,value 为 List对象
     * @param  请求参数泛型
     * @return HTTP response 数据封装对象
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  LiveCommonResponse uploadMultipartFile(String url, E e,
            Map> fileMap) throws IOException, NoSuchAlgorithmException {
        Map paramMap = commonRequestLogic(null, e);
        Map reqMap = new HashMap<>();
        reqMap.put("requestId", e.getRequestId());
        url = MapUtil.appendUrl(url, reqMap);
        url = appendProtocol(url);
        String response = HttpUtil.postMultipleFile(url, paramMap, fileMap, getHttpHeadMap(), null);
        return responseConversion(response, e.getRequestId());
    }
    
    /**
     * 上传文件service结束
     */
    
    /**
     * 公共方法开始
     */
    
    /**
     * 请求参数公共用校验逻辑,添加全局userid、生成签名、转换对象返回
     * @param e 请求参数对象
     * @param  请求参数泛型
     * @return 转换对象为MAP,将签名、时间戳等加入到返回map
     * @throws IOException 异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    private  Map commonRequestLogic(Map signMap, E e)
            throws NoSuchAlgorithmException, UnsupportedEncodingException {
        e.setAppId(LiveGlobalConfig.getAppId());
        if (StringUtils.isBlank(e.getTimestamp())) {
            e.setTimestamp(String.valueOf(System.currentTimeMillis()));
        }
        if (StringUtils.isBlank(e.getRequestId())) {
            String requestId = LiveSignUtil.generateUUID();
            e.setRequestId(requestId);
        } else if (!e.getRequestId().matches(Constant.REQUEST_ID_REG)) {
            String requestId = LiveSignUtil.generateUUID();
            log.info("requestId必须由字母数字下划线组成,长度为8-50位,现重新设置为:{}", requestId);
            e.setRequestId(requestId);
        }
        if (signMap == null) {
            signMap = MapUtil.objectToMap(e);
        } else {
            signMap.put("requestId", e.getRequestId());
        }
        signMap = MapUtil.filterNullValue(signMap);
        String sign = LiveSignUtil.setLiveSign(signMap, LiveGlobalConfig.getAppSecret());
        e.setSign(sign);
        validateBean(e);
        return signMap;
    }
    
    
    /**
     * 采用SDK-validator校验入参
     * @param e 入参
     * @param  入参泛型
     */
    private  void validateBean(E e) {
        List violationMsgList = SDKValidateUtil.validateBean(e);
        if (!violationMsgList.isEmpty()) {
            String errors = SDKValidateUtil.getViolationMsgStr(violationMsgList);
            errors = errors.substring(0, errors.length() - 3);
            errors = "输入参数 [" + e.getClass().getName() + "]对象校验失败 ,失败字段 [" + errors + "]";
            log.error(errors);
            throw new PloyvSdkException(Constant.ERROR_CODE, errors);
        }
    }
    
    /**
     * 把http请求结果转换为LiveCommonResponse对象
     * @param response http请求返回值
     * @param requestId 该请求的
     * @return 直播标准返回参数
     * @throws IOException 客户端和服务器读写异常
     * @throws NoSuchAlgorithmException 签名异常
     */
    protected LiveCommonResponse responseConversion(String response, String requestId)
            throws IOException, NoSuchAlgorithmException {
        LiveCommonResponse liveCommonResponse;
        if (StringUtils.isNotBlank(response)) {
            liveCommonResponse = JSON.parseObject(response, LiveCommonResponse.class);
            if (liveCommonResponse.getCode() != 200) {
                //返回带有requestId则以返回为准
                if(StringUtils.isNotBlank(liveCommonResponse.getRequestId())){
                    requestId = liveCommonResponse.getRequestId();
                }
                String errorMessage = liveCommonResponse.getMessage();
                int errorCode = liveCommonResponse.getCode();
                if(StringUtils.isBlank(errorMessage)){
                    LiveCommonResponse.Error error = liveCommonResponse.getError();
                    if(error != null){
                        //设置新版API错误信息
                        if(StringUtils.isNotBlank(error.getDesc())){
                            errorMessage = error.getDesc();
                        }
                        //设置错误code
                        if(error.getCode() != 0){
                            errorCode = error.getCode();
                        }
                    }
                }
                String message = ERROR_PREFIX1 + requestId + ERROR_INFO + errorMessage;
                PloyvSdkException exception = new PloyvSdkException(errorCode , message);
                log.error(message, exception);
                throw exception;
            }
        } else {
            String message = ERROR_PREFIX + requestId + ERROR_SUFFIX;
            PloyvSdkException exception = new PloyvSdkException(Constant.ERROR_CODE, message);
            log.error(message, exception);
            throw exception;
        }
        return liveCommonResponse;
    }
    
    private Map getHttpHeadMap() {
        Map headMap = new HashMap();
        headMap.put(HttpUtil.SOURCE, LiveGlobalConfig.SDK_NAME);
        headMap.put(HttpUtil.USER_AGENT, LiveGlobalConfig.SDK_NAME + "," + HttpUtil.CURRENT_VERSION);
        headMap.put(HttpUtil.VERSION, HttpUtil.CURRENT_VERSION);
        headMap.put(HttpUtil.APP_ID_NAME, LiveGlobalConfig.getAppId());
        headMap.put(HttpUtil.USER_ID_NAME, LiveGlobalConfig.getUserId());
        return headMap;
    }
    
    /**
     * 增加直播http协议头
     * @param url 需要添加协议头的url
     * @return 添加协议头之后的url
     */
    private String appendProtocol(String url) {
        url = removeProtocol(url);
        if (StringUtils.isNotEmpty(LiveURL.getCustomUri())) {
            if (url.startsWith("api.polyv.net")) {
                url = url.replace("api.polyv.net", LiveURL.getCustomUri());
            }
        }
        if (LiveURL.getIsHttps()) {
            url = Constant.PROTOCOL_HTTPS + url;
        } else {
            url = Constant.PROTOCOL_HTTP + url;
        }
        return url;
    }
    
    /**
     * 移除http协议头
     * @param url 需要添加协议头的url
     * @return 添加协议头之后的url
     */
    private String removeProtocol(String url) {
        url = url.trim();
        if (url.startsWith(Constant.PROTOCOL_HTTPS)) {
            url = url.substring(8);
        } else if (url.startsWith(Constant.PROTOCOL_HTTP)) {
            url = url.substring(7);
        }
        return url;
    }
    
    /**
     * 公共方法结束
     */
    
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy