■ 直接调用阿里云视频点播API实现视频播放

■ 直接调用阿里云视频点播API实现视频播放

前言:公司最近要实现一个视频播放的功能,正常是不需要移动端调用阿里云视频API的,这件事是由后台来完成的。但是既然需求交给我了,就要想办法完成。

先来看一眼官方的API调用文档
https://help.aliyun.com/document_detail/44435.html?spm=5176.product29932.6.618.DUYkdb

有人会说了你直接扔出个阿里云的API你这不是搞笑吗?少侠勿急,且听我细细道来。

调用流程
你要想GET请求网络,请求需要你一些参数,参数的第一位便是签名其余的便是一些公共参数,或者请求特定接口的一些参数。接下来我就要说一下签名的生成过程。

生成签名的过程
就以阿里云获取视频列表的接口为例

final String HTTP_METHOD = "GET";
final String SEPARATOR = "&";
final String EQUAL = "=";

private static final String ENCODE_TYPE = "UTF-8";
String Timestamp = formatIso8601Date(new Date());
String SignatureNonce = UUID.randomUUID().toString();
 Map<String, String> parameterMapX = new HashMap<String, String>();
        //=============7大公共参数==================================
        parameterMapX.put("Format", "JSON");
        parameterMapX.put("Version", "2017-03-21");
        parameterMapX.put("SignatureMethod", "HMAC-SHA1");
        parameterMapX.put("SignatureVersion", "1.0");
        parameterMapX.put("AccessKeyId", WJ_Home_AccessKey);
        parameterMapX.put("Timestamp", Timestamp); 
        parameterMapX.put("SignatureNonce", SignatureNonce);//随机数
        //=============分割线下的是特有参数==================================
        parameterMapX.put("Action", "GetVideoList");
        parameterMapX.put("PageNo", "1");
        parameterMapX.put("PageSize", "10");
        parameterMapX.put("CateId", CateId);//视频分类id可以不用传,默认是-1
        List<String> sortedKeys = new ArrayList<String>(parameterMapX.keySet());
        Collections.sort(sortedKeys);
         //开始生成签名
        String PuR8IfTyWIan = GoToSign(sortedKeys, parameterMapX);
        //拼接url请求网络了,我这里用的是nohttp的get请求 3.X
          NetworkRequestX(PuR8IfTyWIan);
        
   //计算ISO8601时间方法
    private static String formatIso8601Date(Date date) {
        SimpleDateFormat df = new SimpleDateFormat(ISO8601_DATE_FORMAT);
        df.setTimeZone(new SimpleTimeZone(0, "GMT"));
        return df.format(date);
    }
  //转码工具类
    private static String percentEncode(String value) {
        if (value == null) return null;
        try {
            return URLEncoder.encode(value, ENCODE_TYPE).replace("+", "%20").replace("*", "%2A").replace("%7E", "~");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return value;
    }

这里我把获取签名封装成了一个方法,更方便大家的使用

   private String GoToSign(List<String> sortedKeys, Map<String, String> parameterMap) {
        StringBuilder stringToSign = new StringBuilder();
        stringToSign.append(HTTP_METHOD).append(SEPARATOR);
        stringToSign.append(percentEncode("/")).append(SEPARATOR); //拼接的时候要进行转码
        StringBuilder QueryString = new StringBuilder();
        for (String key : sortedKeys) {
            // 此处需要对key和value进行编码
            String value = parameterMap.get(key);
            QueryString.append(SEPARATOR).append(percentEncode(key)).
            append(EQUAL).append(percentEncode(value));
        }
   //获取拼接的字符串  **拼接样式见1.X**   
  StringBuilder append = stringToSign.append(percentEncode(QueryString.toString().substring(1)));
  
	  //**hmac_sha1算法的第一个参数是密钥+&** 一定要加&
        String PuR8IfTyWIan = hmac_sha1(AccessSecret+&, append.toString()).trim();
      //通过Hmac_sha1算法计算出的 **拼接样式见2.X**
        return PuR8IfTyWIan;
    }
 private String hmac_sha1(String key, String datas) {
        String reString = "";

        try {
            byte[] data = key.getBytes("UTF-8");
            //根据给定的字节数组构造一个密钥,第二参数指定一个密钥算法的名称
            SecretKey secretKey = new SecretKeySpec(data, "HmacSHA1");
            //生成一个指定 Mac 算法 的 Mac 对象
            Mac mac = Mac.getInstance("HmacSHA1");
            //用给定密钥初始化 Mac 对象
            mac.init(secretKey);

            byte[] text = datas.getBytes("UTF-8");
            //完成 Mac 操作
            byte[] text1 = mac.doFinal(text);

            reString = Base64.encodeToString(text1, Base64.DEFAULT);

        } catch (Exception e) {
            // TODO: handle exception
        }

        return reString;
    }

拼接样式1.X

GET&%2F&AccessKeyId%3DLTAIPuR8IfTyWIan%26Action%3DGetVideoPlayAuth%26Format%3DJSON%26SignatureMethod%3DHMAC-SHA1%26SignatureNonce%3D578a50c1-280d-4a34-bffc-e0sda6b2df76%26SignatureVersion%3D1.0%26Timestamp%3D2017-08-11T08%253A56%253A39Z%26Version%3D2017-03-21%26VideoId%3D86d0a02dfccc46bab045d954e6b70036

拼接样式2.X

9or7epLWdsgMIvtRlJZm57HpBGs=

样式3.X
这里写图片描述

最后我强调一点 就是拼接URL这一点(我在拼接的时候没有进行转码,也能请求成功!)

我的URL

 http://vod.cn-shanghai.aliyuncs.com?Signature=7K0h2pa/JS4KdC6XEKiYrw7a3EU=&SignatureNonce=bb8d6d93-e56c-4e76-b7d8-f4be3490b7e6&Format=JSON&CateId=133999353&SignatureMethod=HMAC-SHA1&Timestamp=2017-08-13T13%3A15%3A22Z&SignatureVersion=1.0&Action=GetVideoList&Version=2017-03-21&PageNo=1&PageSize=10&AccessKeyId=LTAIPuR8IfTyWIan

阿里云的URL

http://vod.cn-shanghai.aliyuncs.com?Signature=UI%2FwKfuvTtphzCKHwPhP0ErtLnc%3D&SignatureVersion=1.0&Action=GetVideoPlayAuth&Format=JSON&VideoId=68a4d2629a339db3207963ac073a88cd&SignatureNonce=578a50c1-280d-4a34-bffc-e06aa6b2df76&Version=2017-03-21&AccessKeyId=testId&SignatureMethod=HMAC-SHA1&Timestamp=2017-03-29T12%3A09%3A11Z

有人就会说了为什么你不跟着阿里爸爸方法走呢?
经过hmac_sha1我的转码后的签名,

UI%2QcKDaeGtplzCJHwPhP0ErtLnc%3DOA

阿里云的转码后的签名

UI%2FwKfuvTtphzCKHwPhP0ErtLnc%3D

为什么没有跟阿里爸爸的方法走,是因为我转码过后就多出个0A,如果按照阿里云的调用方式最后等待我的结果只有SignatureDoesNotMatch


API给的方法是这样的

 // 生成请求URL
    StringBuilder requestURL;
    requestURL = new StringBuilder("http://vod.cn-shanghai.aliyuncs.com?");
    requestURL.append(URLEncoder.encode("Signature", ENCODE_TYPE)).append("=").append(signature);
    for (Map.Entry<String, String> e : parameterMap.entrySet()) {
    requestURL.append("&").append(percentEncode(e.getKey())).append("=").append(percentEncode(e.getValue()));

因为它把集合中的数据进行了转码,当生成了URL,你对这个url进行请求的时候InvalidTimeStamp.Format时间戳格式不对

解决办法

requestURL.append("&").append(e.getKey()).append("=").append(e.getValue());

希望这篇博客可以帮助到你

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/2852.html原文链接:https://javaforall.net

(0)
上一篇 2021年3月12日 下午10:52
下一篇 2021年3月12日 下午10:52


相关推荐

  • html清除浮动有几种方法,几种css 清除浮动的方法

    html清除浮动有几种方法,几种css 清除浮动的方法1 采用伪类 after 进行后续空制的高度位零的伪类层清除 2 采用 cssoverflow auto 的方式撑高 3 采用 cssoverflow hidden 的方式产生怪异适应 4 采用 display table 将对象变成 table 形式 5 采用 div 标签 以及 css 的 clear 属性 6 采用 br 标签 以及 css 的 clear 属性 7 采用 br 标签 以及其自身 html 的 clear 属性粗略的看 他们都能将问题解

    2026年3月18日
    2
  • java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?「建议收藏」

    java 静态变量 存储_Java中存储的静态方法和静态变量在哪里?「建议收藏」静态方法(实际上所有方法)以及静态变量都存储在PermGen部分,因为它们是反射数据的一部分(类相关数据,而不是与实例相关的)。需要澄清的最新情况:注意,只有变量及其技术值(原语或引用)存储在PermGen空间中。如果静态变量是对象的引用,则该对象本身存储在堆的正常部分(年轻/旧代或幸存者空间)。这些对象(除非它们是类等内部对象)是不存储在PermGen空间。例子:staticinti=1…

    2022年5月2日
    40
  • 我收到俩BP,一份是Manus(另一份也是)

    我收到俩BP,一份是Manus(另一份也是)

    2026年3月15日
    2
  • ACID、BASE和CAP原理

    ACID、BASE和CAP原理1.ACID   ACID,是指在数据库管理系统(DBMS)中,事务(transaction)所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。  在数据库系统中,一个事务是指:由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户

    2022年5月19日
    57
  • Bootstrap 表格边框设置

    Bootstrap 表格边框设置通过添加 table borderedclas 您将看到每个元素周围都有边框 且占整个表格是圆角的 如下面的实例所示 DOCTYPE tml html head title Bootstrap 实例 边框表格 title linkhref bootstrap css bootstrap min css rel stylesheet lt linkhref head html

    2026年3月20日
    2
  • 通过nginx转发WebSocket

    通过nginx转发WebSocket通过nginx请求wensocket的时候需要修改配置文件,对于websocket请求需要特殊处理一下,需要在conf配置文件中添加一些配置:server{listen8080;server_nametest.com;add_header’Access-Control-Allow-Origin”*’always;add_header’Access-Control-Allow-Credentials”true’;add_header’A

    2022年10月18日
    5

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号