Loading

腾讯云点播 服务端 API使用httpclient获取视频信息

前言

继上次更新腾讯云点播已有两个月了
由于在weblogic部署项目的jdk版本是1.7, 所以使用腾讯云的SDK根本用不了,而且每次已修改代码都是要重新打个war把修改到的class替换上去,麻烦死了

使用更换成http去请求信息

官方推荐使用post
支持的 HTTP 请求方法:

请求结构

https://vod.tencentcloudapi.com/?Action=DescribeMediaInfos
&FileIds.0=5285485487985271487
&FileIds.1=5285485487985271488
&<公共请求参数>

签名方法参考地址

https://cloud.tencent.com/document/product/266/31757#Java

demo参考

public class a {
    private final static Charset UTF8 = StandardCharsets.UTF_8;
    private final static String SECRET_ID = "";
    private final static String SECRET_KEY = "";
    private final static String CT_JSON = "application/json; charset=utf-8";

    public static byte[] hmac256(byte[] key, String msg) throws Exception {
        Mac mac = Mac.getInstance("HmacSHA256");
        SecretKeySpec secretKeySpec = new SecretKeySpec(key, mac.getAlgorithm());
        mac.init(secretKeySpec);
        return mac.doFinal(msg.getBytes(UTF8));
    }

    public static String sha256Hex(String s) throws Exception {
        MessageDigest md = MessageDigest.getInstance("SHA-256");
        byte[] d = md.digest(s.getBytes(UTF8));
        return DatatypeConverter.printHexBinary(d).toLowerCase();
    }


    public static void main(String[] args) throws Exception {
        requestToBaiDu();
    }

    public static void requestToBaiDu() throws Exception {
        String fileId = "";
        String service = "vod";
        String host = "vod.tencentcloudapi.com";
        String region = "";
        String action = "DescribeMediaInfos";
        String version = "2018-07-17";
        String algorithm = "TC3-HMAC-SHA256";
        String timestamp = String.valueOf(System.currentTimeMillis() / 1000);
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        // 注意时区,否则容易出错
        sdf.setTimeZone(TimeZone.getTimeZone("UTC"));
        String date = sdf.format(new Date(Long.valueOf(timestamp + "000")));


        // ************* 步骤 1:拼接规范请求串 *************
        String httpRequestMethod = "POST";
        String canonicalUri = "/";
        String canonicalQueryString = "";
        String canonicalHeaders = "content-type:application/json; charset=utf-8\n" + "host:" + host + "\n";
        String signedHeaders = "content-type;host";

        StringBuilder payload = new StringBuilder();
        payload.append("{\"FileIds\":[\"");
        payload.append(fileId);
        payload.append("\"]}");

        System.out.println("payload======>" + payload.toString());
        String hashedRequestPayload = sha256Hex(payload.toString());
        String canonicalRequest =
                httpRequestMethod + "\n" +
                        canonicalUri + "\n" +
                        canonicalQueryString + "\n" +
                        canonicalHeaders + "\n" +
                        signedHeaders + "\n" +
                        hashedRequestPayload;
        System.out.println(canonicalRequest);

        // ************* 步骤 2:拼接待签名字符串 *************
        String credentialScope = date + "/" + service + "/" + "tc3_request";
        String hashedCanonicalRequest = sha256Hex(canonicalRequest);
        String stringToSign =
                algorithm + '\n' +
                        timestamp + '\n' +
                        credentialScope + '\n' +
                        hashedCanonicalRequest;


        // ************* 步骤 3:计算签名 *************

        byte[] secretDate = hmac256(("TC3" + SECRET_KEY).getBytes(UTF8), date);
        byte[] secretService = hmac256(secretDate, service);
        byte[] secretSigning = hmac256(secretService, "tc3_request");
        String signature = DatatypeConverter.printHexBinary(hmac256(secretSigning, stringToSign)).toLowerCase();


        // ************* 步骤 4:拼接 Authorization *************
        String authorization = algorithm + " " + "Credential=" + SECRET_ID + "/" + credentialScope + ", "
                + "SignedHeaders=" + signedHeaders + ", " + "Signature=" + signature;
        System.out.println(authorization);

        //发送请求的URL
        StringBuffer url = new StringBuffer();
        url.append("https://vod.tencentcloudapi.com");
        //使用帮助类HttpClients创建CloseableHttpClient对象
        CloseableHttpClient client = HttpClients.createDefault();
        //HTTP请求类型创建HttpPost实例
        HttpPost post = new HttpPost(url.toString());
        post.setHeader("Authorization", authorization);
        post.setHeader("Content-Type", CT_JSON);
        post.setHeader("Host", host);
        post.setHeader("X-TC-Action", action);
        post.setHeader("X-TC-Timestamp", timestamp);
        post.setHeader("X-TC-Version", version);
        post.setHeader("X-TC-Region", region);
        CloseableHttpResponse response = null;
        //string是一个json字符串
        StringEntity params = new StringEntity(payload.toString(), "UTF-8");
        params.setContentType("application/json;charset=UTF-8");
        post.setEntity(params);
        try {
            //通过执行HttpPost请求获取CloseableHttpResponse实例 ,从此CloseableHttpResponse实例中获取状态码,错误信息,以及响应页面等等.
            response = client.execute(post);
            HttpEntity entity = response.getEntity();
            Header headers[] = response.getAllHeaders();
            int i = 0;
            System.out.println("<=====================>==>");

            while (i < headers.length) {
                System.out.println("请求头部信息=====>" + headers[i].getName() + ":  " + headers[i].getValue());
                i++;
            }
            String resData = EntityUtils.toString(entity, UTF8);
            com.alibaba.fastjson.JSONObject jsonObject = com.alibaba.fastjson.JSONObject.parseObject(resData);
            String resultResponse = String.valueOf(jsonObject.get("Response"));
            com.alibaba.fastjson.JSONObject resultResponses = com.alibaba.fastjson.JSONObject.parseObject(resultResponse);
            JSONArray mediaInfoSetArray = (JSONArray) resultResponses.getJSONArray("MediaInfoSet");
            System.out.println(resData);
            EntityUtils.consume(entity);
        } catch (
                UnsupportedEncodingException e) {
            e.printStackTrace();
        } catch (
                IOException e) {
            e.printStackTrace();
        } finally {//最后关闭HttpClient资源.
            if (client != null) {
                try {
                    client.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (response != null) {
                try {
                    response.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

具体流程

->首先需要获取签名(官方文档已有示例 1、拼接规范请求串,2、拼接待签名字符串,3、计算签名,4、拼接 Authorization)
->传入相关视频id
->HTTP请求类型创建HttpPost实例发送请求,返回相关数据

posted @ 2021-12-14 17:48  Rzk  阅读(355)  评论(0编辑  收藏  举报