■ 直接调用阿里云视频点播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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • android 画图 平面图,房屋平面图 DIY 神工具!「MagicPlan」用手机拍照就自动帮你画好(iPhone, Android)…

    android 画图 平面图,房屋平面图 DIY 神工具!「MagicPlan」用手机拍照就自动帮你画好(iPhone, Android)…不论是新屋装潢还是老屋改装,为了省下设计费,许多人都会想自己动手画平面图,但是如果本身没有相关的底子,从怎么开始动手测量尺寸到画出完整的全屋平面图,每个点都有让人不知所措的地方。来!免惊~「MagicPlan」快拿去用!它简直就是我们这种无设计底子平凡人的救星,只要拿着手机或平板拍几张照,房屋或房间的平面图就完成啦!什么?你说听起来很神吗?没错它就是这么神呀!完全不需测量、不需自己拿笔尺绘制、不需…

    2022年5月25日
    166
  • 简单页面+java后台+数据库,实现从页面对数据库的增删改查

    简单页面+java后台+数据库,实现从页面对数据库的增删改查在实现简单网页上对数据内容进行增删改查,需要用到三个部分,分别是jsp网页部分+java后台部分+数据库表我用一个新闻的例子来实现,首先编写java后台程序java后台程序:我们用三层的模式进行设计:分别是servlet,service,dao层,并且建立个实体包用来打包数据库和后台要用到的属性截个图首先是写功能写的顺序分别是从servlet,service,dao层…

    2022年5月22日
    35
  • Python绘图Turtle库详解[通俗易懂]

    Python绘图Turtle库详解[通俗易懂]Turtle库是Python语言中一个很流行的绘制图像的函数库,想象一个小乌龟,在一个横轴为x、纵轴为y的坐标系原点,(0,0)位置开始,它根据一组函数指令的控制,在这个平面坐标系中移动,从而在它爬行的路径上绘制了图形。turtle绘图的基础知识:1.画布(canvas)画布就是turtle为我们展开用于绘图区域,我们可以设置它的大小和初始位置。…

    2022年6月9日
    60
  • 软件测试流程五个阶段

    软件测试流程五个阶段软件测试按照研发阶段一般分为5个部分:单元测试、集成测试、确认测试、系统测试、验收测试,下面将不同阶段需要的一些工作内容做一下梳理希望可以帮助到大家。 //No.1//单元测试 单元测试又称为模块测试,是针对软件设计的最小单位程序模块进行正确性检查的测试工作,单元测试需要从程序内部结构出发设计测试用例,多个模块可以平行地独立进行单元测试。一、单元测试的内容: 1、模…

    2022年6月7日
    63
  • 认识Vue 的 export、export default、import

    认识Vue 的 export、export default、import首先要知道 export import exportdefaul 是什么 nbsp 作为 copy 砖家 具体概念我还真是迷糊 查阅资料 ES6 模块主要有两个功能 export 和 import export 用于对外输出本模块 一个文件可以理解为一个模块 变量的接口 import 用于在一个模块中加载另一个含有 export 接口的模块 也就是说使用 export 命令定义了模块的对外接口以后 其他 JS

    2025年8月14日
    6
  • git使用具体介绍

    git使用具体介绍

    2021年12月4日
    34

发表回复

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

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