前言:公司最近要实现一个视频播放的功能,正常是不需要移动端调用阿里云视频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可以不用传,默认是-1List<String> sortedKeys = new ArrayList<String>(parameterMapX.keySet());Collections.sort(sortedKeys);//开始生成签名String PuR8IfTyWIan = GoToSign(sortedKeys, parameterMapX);//拼接url请求网络了,我这里用的是nohttp的get请求 3.XNetworkRequestX(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给的方法是这样的

 // 生成请求URLStringBuilder 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());

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

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

  1. 调用阿里云web API实现滑块验证码

    文章目录 滑块验证码的实现原理 调用阿里云web API实现图形验证码 效果演示: 本来想着弄一个算术验证码的,后来发现这玩意儿对我自己也太不友好了

  2. 调用阿里云SLB API设置SLB权重

    背景:服务部署在阿里云ECS上,使用了阿里云SLB做负载均衡.使用jenkins做金丝雀发时,希望可以自动修改SLB的权重,实现服务器的上下线. 安装阿里云Python SDK 完成以下操作安装Pyt ...

  3. 【视频点播】阿里云视频点播如何获取视频播放的URL

    在使用视频点播服务时最常见的情况就是使用一个播放器去播放一个视频URL,这个播放器可能是h5播放器.安卓播放器.iOS播放器.那么如何获取视频播放的URL呢? 1.通过服务端接口获取 视频点播提供了o ...

  4. 后端调用阿里云快递API接口--后端部分

    这是小练手,调用接口要买,一般都会有一次机会0元100次 为了节约调用接口的次数 后端部分:(快递接口不同的话会出错) 工具类 1.HttpUtils import org.apache.common ...

  5. python如何调用阿里云接口_python 调用阿里云云解析api添加记录

    首先安装阿里云SDK pip install aliyun-python-sdk-core pip install aliyun-python-sdk-alidns 可以配合jenkins传递参数 # ...

  6. JAVA中调用阿里云语音通知Api并接收消息回执

    JAVA中调用阿里云语音通知Api并接收消息回执 配置文件 需要的包 <dependency><groupId>com.aliyun</groupId><ar ...

  7. vue调用阿里云无痕验证

    vue调用阿里云无痕验证 在调用阿里云无痕验证时有个先决条件需要全局变量先定义才能去加载js set_ALY_config () {var _this = thisreturn new Promise ...

  8. 踩坑记:C#访问阿里云的API小结,阿里云的文档有待改善……

    为运维管理方便需要,写了一个小工具去调用阿里云的API,包括操作ECS.SLB.域名等等API,结果就这么一点点小东西,也被阿里云的文档坑了好多次,下面5个问题,有3个跟阿里云文档相关-- 关键是阿里 ...

  9. 调用阿里云接口一键实现人像动漫化

    调用阿里云接口一键实现人像动漫化 前言 一.整体流程 二.生成效果 总结 前言 在一篇博客中学到了调用API实现人像动漫化,不过有些东西还不是特别明白,所以写下这篇文章,参考链接在末尾,通过调用阿里云 ...

最新文章

  1. oracle和ibatis学习
  2. 租车java 查询_基于java实现租车管理系统
  3. 2021年安徽高考英语口试成绩查询,2021高考英语口语考试成绩
  4. 终于,我读懂了所有Java集合——queue篇
  5. html调用js函数_使用Require.js实现模块化开发
  6. markdown html图片,Markdown语法对应的HTML标签实现
  7. vue+springboot传数据到数据库一直报错500解决方案
  8. IP定位如何揪出SEM、百度竞价的“头号天敌——恶意点击”
  9. 【R语言实例】igraph — 网络分析与可视化包(1)
  10. python采集微信公众号_Python爬虫,微信公众号文章采集工具
  11. CDA Level Ⅲ 模拟题(二)
  12. android修改短信内容,Android手机
  13. 总说业务,到底业务常用的指标有哪些
  14. “科林明伦杯”哈尔滨理工大学第十届程序设计竞赛
  15. Matlab中的傅里叶级数展开函数
  16. 离开工作了五年的公司,还是留下来?
  17. Linux环境下NDK JNI开发实例
  18. 车牌识别软件简析及国内各厂家对比数据
  19. 党校学员毕业自我鉴定总结样文分享
  20. 2022湖北恩施州宣恩县城市社区工作者招聘测试题及答案

热门文章

  1. 颜色转换助手RGB888-565
  2. SOLIDWORKS提供的“走查”功能,身临其境感受自己的设计 | 操作视频
  3. 把北斗七星与北极星捡起来
  4. Resilience4j简介
  5. 跑步时戴什么耳机好、分享五款最适合跑步的运动耳机排名清单
  6. DDR3基本的读写测试,适用于verilog语言学习
  7. Android编译Lambda,Android lambda 入门教程
  8. Android 短视频编辑开发之摄像头预览实时美颜(三)
  9. C语言转义字符'\'
  10. python json dump时,中文乱码问题