JAVA对接CC视频的API

JAVA对接CC视频的API


点播的接口文档
直播的接口文档


对接流程:
1.HTTP通信加密实现:
CC视频接口的请求参数hash需要由其它请求参数和api key为盐值hash而成,首先要对普通的查询参数(包括当前时间戳)进行字典序的排序,然后再以key为盐值进行MD5得到hash值
实现代码如下:

    /**
     * 将参数按字典序排序
     *
     * @param queryString 查询的参数
     * @return 按字典序的参数
     */
    private String order(String queryString) {
        String[] list = queryString.split("&");
        return Arrays.stream(list)
                .sorted()
                .collect(Collectors.joining("&"));
    }

    /**
     * 日期格式字符串转换成时间戳
     *
     * @param dateStr 字符串日期
     * @param format  如:yyyy-MM-dd HH:mm:ss
     */
    private String DateToTimeStamp(String dateStr, String format) {
        try {
            SimpleDateFormat sdf = new SimpleDateFormat(format);
            return String.valueOf(sdf.parse(dateStr).getTime() / 1000);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 生成md5
     */
    private String getMD5(String message) {
        String md5str = "";
        try {
            // 1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
            MessageDigest md = MessageDigest.getInstance("MD5");
            // 2 将消息变成byte数组
            byte[] input = message.getBytes();
            // 3 计算后获得字节数组,这就是那128位了
            byte[] buff = md.digest(input);
            // 4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
            md5str = bytesToHex(buff);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return md5str;
    }

    /**
     * 二进制转十六进制
     */
    private String bytesToHex(byte[] bytes) {
        StringBuffer md5str = new StringBuffer();
        // 把数组每一字节换成16进制连成md5字符串
        int digital;
        for (int i = 0; i < bytes.length; i++) {
            digital = bytes[i];
            if (digital < 0) {
                digital += 256;
            }
            if (digital < 16) {
                md5str.append("0");
            }
            md5str.append(Integer.toHexString(digital));
        }
        return md5str.toString().toUpperCase();
    }

    /**
     * @param queryString 要求转化的参数
     * @param isVideo 是否调用点播,true为点播api,false为直播api
     * @return 有效的请求参数
     */
    private String decode(String queryString, boolean isVideo) {

        //获得当前时间
        Date now = new Date();
        SimpleDateFormat simpleDateFormat = new SimpleDateFormat(dateFormat);
        //最終的MD5后的結果除了&hash=以外的参数
        String hashedQueryString = order(queryString)
                + "&time=" + DateToTimeStamp(simpleDateFormat.format(now), dateFormat);
        //进行md5的参数
        String temp;
        if (isVideo) {
            temp = hashedQueryString + "&salt=" + key;
        } else {
            temp = hashedQueryString + "&salt=" + room_key;
        }
        return hashedQueryString + "&hash=" + getMD5(temp);
    }

注意点:点播的key和直播的key是不一样
2.HTTP请求实现
CC视频的接口均采用GET方式访问,博主使用的时JDK的HttpURLConnection这个类来进行请求。
实现如下:

    /**
     * 使用HttpURLConnection
     * 访问CC视频接口的函数
     * @param requestUri 調用的api的地址
     * @param isVideo 是否调用点播,true为点播api,false为直播api
     * @return 请求结果
     */
    private String request(String requestUri, String params, boolean isVideo) {
        URL url;
        HttpURLConnection conn;
        try {
            //url_prefix 为基本上所有api请求都有的参数userid以及format
            url = new URL(requestUri + decode(url_prefix + params, isVideo));
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setDoInput(true);
            conn.connect();
            InputStream inputStream = conn.getInputStream();
            BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream, "UTF-8"));
            final StringBuffer stringBuffer = new StringBuffer();
            String line;
            while ((line = bufferedReader.readLine()) != null) {
                stringBuffer.append(line);
            }
            bufferedReader.close();
            inputStream.close();
            return stringBuffer.toString();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

注意点:如果请求的参数存在中文,比如调用搜索视频的接口时,title的参数值需要进行转码URLEncoder.encode(title, "UTF-8"),注意特殊字符也需要装码,例如请求排序时&sort=CREATION_DATE:DESC要写成&sort=CREATION_DATE%3ADESC


最后附上博主github的样例代码,只实现了部分api功能的工具包

猜你喜欢

转载自blog.csdn.net/madonghyu/article/details/80373120