最近,我在做一个视频上传功能,其中一个需求是:待视频上传成功之后需要获取当前视频的时长,由于我们的视频是放在第三方平台上,所以我们需要调用第三方平台接口来获取我想要的数据,API如下:
接口名称:批量获取视频的时长和大小
接口URL
http://api.polyv.net/v2/video/{userid}/info
接口说明
获取多个视频的时长和大小
请求方式
GET
支持格式
JSON
请求参数
参数名 | 必选 | 类型及范围 | 说明 |
---|---|---|---|
vids | true | string | 多个视频ID(逗号分割) |
sign | true | string | 签名,40位大写的sha1值 |
ptime | true | string | 当前13位毫秒级时间戳,3分钟内有效 |
format | false | string | 默认返回json格式,如果format=xml返回xml格式 |
jsonp | false | string | 例如,正常情况{error:0,data:””},加 jsonp=a后返回a({error:0,data:””}) |
JSON返回
{
"code": 200,
"status": "success",
"message": "success",
"data": [
{
"vid": "2d939377c23a37d2b0a2428006755627_2",
"duration": "00:09:40",
"filesize1": 9714032,
"filesize2": 9415768
},
{
"vid": "2d939377c23ebcfe8b4ff3dadcabfbbf_2",
"duration": "00:00:14",
"filesize1": 574357,
"filesize2": 1092671
}
]
}
返回错误json
{
"code": 400,
"status": "error",
"message": "sign can not be empty.",
"data": ""
}
PHP示例代码
<?php
$userid="2d939377c2";
$vids="2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_2";
$ptime=time()*1000;
$secretkey="3OmoLbTlHu";
$str="ptime=$ptime&vids=$vids".$secretkey;
$sign=strtoupper(sha1($str));
$url="http://api.polyv.net/v2/video/$userid/info?ptime=$ptime&sign=$sign&vids=$vids";
$content = file_get_contents($url);
echo $content;
?>
签名规则:
将非空的请求参数按照参数名字典顺序排列,连接参数名与参数值,并在尾部加上secretkey,生成40位大写SHA1值,作为sign。 以下是示例过程:
- 请求参数为
"ptime" = "1493344799000"
"vids" = "2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_2"
- 将请求参数按照参数名字典顺序排列
"ptime" = "1493344799000"
"vids" = "2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_2"
- 连接字符串
连接参数名与参数值,并在尾部加上secretkey(secretkey的值为3OmoLbTlHu),如下:
ptime=1493344799000&vids=2d939377c23a37d2b0a2428006755627_2,2d939377c23ebcfe8b4ff3dadcabfbbf_23OmoLbTlHu
- 生成签名sign
66A7000F442DB7D701533C69F44053521D17C7D0
看完以上信息之后,我自己将PHP代码改造成Java代码,得到的接口如下所示:
Controller类
/**
* 获得视频时长
* @param request
* @param vid
* @return
*/
@RequestMapping("/getVideoDurationFromPolyv")
@ResponseBody
public Map<String,Object> getVideoDurationFromPolyv(HttpServletRequest request,@RequestParam("vid") String vid){
Map<String, Object> json = new HashMap<String, Object>();
try {
String duration = "";
if (vid != null && !"".equals(vid)){
duration = PolyvTokenUtil.getPolyvDuration(request, vid);
if(duration!=null&&!"".equals(duration)){
json=this.setJson(true, "OK", duration);
}else{
json=this.setJson(false, "抱歉,由于您的网速太差导致获取视频时长失败,请点击“清空”按钮后再重新上传!", null);
}
}else{
json=this.setJson(false, "参数vid错误!", null);
}
} catch (Exception e) {
logger.error("PolyvTokenController.getPreviewDurationFromPolyv()--error", e);
this.setAjaxException(json);
}
return json;
}
PolyvTokenUtil类
/**
* 获取视频时长
* @param request
* @param vid
* @return
*/
public static String getPolyvDuration(HttpServletRequest request,String vid){
try {
String userId = "123456"; // polyv 提供的服务器间的通讯验证
String secretkey = "123456"; // polyv 提供的接口调用签名访问的key
String ptime = ""+System.currentTimeMillis(); // 时间戳
String str="ptime="+ptime+"&vids="+vid+secretkey;
String sign=SecuritySHA1Utils.shaEncode(str).toUpperCase();
String url="http://api.polyv.net/v2/video/"+userId+"/info";
String param="ptime="+ptime+"&sign="+sign+"&vids="+vid;
String result=sendGet(url,param);
System.out.println("1:-------"+result);
JSONObject jsonObject = JSONObject.parseObject(result);
System.out.println("2:-------"+jsonObject);
if(jsonObject.get("data")!=null&&!"".equals(jsonObject.get("data"))){
String result1=jsonObject.get("data").toString();
System.out.println("3:-------"+result1);
Map<?, ?> map = JSON.parseObject(result1, Map.class);
if(map.get("duration")!=null&&!"".equals(map.get("duration"))){
return map.get("duration").toString();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
/*Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}*/
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
Js代码:
$.ajax({
url: '${ctx}/polyv/getVideoDurationFromPolyv',
type: 'post',
data: {
'vid': vid
},
success: function(result) {
if(result.success == true) {
if(result.entity != null &&
result.entity != "") {
//视频时长
var time = result.entity;
alert(time);
$("#time-sc").val(time);
return true;
}
} else {
alert(result.message);
return false;
}
},
error: function(res) {
alert("抱歉,系统繁忙,请稍后再试!" + res);
return false;
}
});
运行结果如下所示:
1:-------{"code":200,"status":"success","message":"success","data":[{"vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b","duration":"00:00:15"}]}
2:-------{"message":"success","status":"success","data":[{"duration":"00:00:15","vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b"}],"code":200}
3:-------[{"duration":"00:00:15","vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b"}]
com.alibaba.fastjson.JSONException: syntax error, expect {, actual [, pos 1, json : [{"duration":"00:00:15","vid":"b5dd6d8e214aeab5dc374fbdae5dec0e_b"}]
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:222)
at com.alibaba.fastjson.parser.deserializer.MapDeserializer.deserialze(MapDeserializer.java:58)
at com.alibaba.fastjson.parser.deserializer.MapDeserializer.deserialze(MapDeserializer.java:39)
at com.alibaba.fastjson.parser.DefaultJSONParser.parseObject(DefaultJSONParser.java:642)
以上错误大概是“数据不是json格式,转化失败!”,根据第三条的打印结果我们也能看出数据格式确实不是json格式的,而后我又把PolyvTokenUtil类里面的getPolyvDuration()改为如下:
/**
* 获取视频时长
* @param request
* @param vid
* @return
*/
public static String getPolyvDuration(HttpServletRequest request,String vid){
try {
String userId = "123456"; // polyv 提供的服务器间的通讯验证
String secretkey = "123456"; // polyv 提供的接口调用签名访问的key
String ptime = ""+System.currentTimeMillis(); // 时间戳
String str="ptime="+ptime+"&vids="+vid+secretkey;
String sign=SecuritySHA1Utils.shaEncode(str).toUpperCase();
String url="http://api.polyv.net/v2/video/"+userId+"/info";
String param="ptime="+ptime+"&sign="+sign+"&vids="+vid;
String result=sendGet(url,param);
System.out.println("1:-------"+result);
JSONObject jsonObject = JSONObject.parseObject(result);
System.out.println("2:-------"+jsonObject);
if(jsonObject.get("data")!=null&&!"".equals(jsonObject.get("data"))){
String result1=jsonObject.get("data").toString();
System.out.println("3:-------"+result1);
result1=result1.replace("[", "");
result1=result1.replace("]", "");
//序列化为JSON字符串
String result2 = JSON.toJSONString(result1);
System.out.println("4:-------"+result2);
//通过 replace去掉斜杠
String result3= result2.replace("\\", "");
System.out.println("5:-------"+result3);
//去掉首尾的引号
String result4 = result3.substring(1, result3.length() - 1);
System.out.println("6:-------"+result4);
Map<?, ?> map = JSON.parseObject(result1, Map.class);
if(map.get("duration")!=null&&!"".equals(map.get("duration"))){
return map.get("duration").toString();
}
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
运行项目得到结果如下所示:
1:-------{"code":200,"status":"success","message":"success","data":[{"vid":"b5dd6d8e21f4bc424693d6a784695d30_b","duration":"00:00:15"}]}
2:-------{"message":"success","status":"success","data":[{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}],"code":200}
3:-------[{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}]
4:-------"{\"duration\":\"00:00:15\",\"vid\":\"b5dd6d8e21f4bc424693d6a784695d30_b\"}"
5:-------"{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}"
6:-------{"duration":"00:00:15","vid":"b5dd6d8e21f4bc424693d6a784695d30_b"}
看上去貌似成功啦,但是要注意:jsonObject.get("data")得到的是一个JSONArray,而不是String,那么,当JSONArray为空的时候【if(jsonObject.get("data")!=null&&!"".equals(jsonObject.get("data")))】这样判断就不对,系统会报错,控制台输出结果如下所示:
因此,我又把PolyvTokenUtil类里面的getPolyvDuration()改为如下:
/**
* 获取视频时长
* @param request
* @param vid
* @return
*/
public static String getPolyvDuration(HttpServletRequest request,String vid){
try {
String userId = "123456"; // polyv 提供的服务器间的通讯验证
String secretkey = "123456"; // polyv 提供的接口调用签名访问的key
String ptime = ""+System.currentTimeMillis(); // 时间戳
String str="ptime="+ptime+"&vids="+vid+secretkey;
String sign=SecuritySHA1Utils.shaEncode(str).toUpperCase();
String url="http://api.polyv.net/v2/video/"+userId+"/info";
String param="ptime="+ptime+"&sign="+sign+"&vids="+vid;
String result=sendGet(url,param);
System.out.println("1:-------"+result);
JSONObject jsonObject = JSONObject.parseObject(result);
System.out.println("2:-------"+jsonObject);
JSONArray dataNJson = jsonObject.getJSONArray("data");
System.out.println("dataNJson:"+dataNJson);
if(dataNJson.isEmpty()||dataNJson.size()<1){
return null;
}else{
String string = dataNJson.getString(0);
JSONObject fromObject = JSONObject.parseObject(string);
String duration = fromObject.getString("duration");
System.out.println("duration:"+duration);
return duration;
}
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
运行项目得到结果如下所示:
1:-------{"code":200,"status":"success","message":"success","data":[{"vid":"b5dd6d8e21cb480a394d522b3f125d7c_b","duration":"00:00:15"}]}
2:-------{"message":"success","status":"success","data":[{"duration":"00:00:15","vid":"b5dd6d8e21cb480a394d522b3f125d7c_b"}],"code":200}
dataNJson:[{"duration":"00:00:15","vid":"b5dd6d8e21cb480a394d522b3f125d7c_b"}]
duration:00:00:15
OK,大功告成!
综上所述,简而言之,主要归结到一个问题:JSONObject如何获取JSONArray转JSONObject获取某个属性值?
主要代码如下所示:
public static void main(String[] args) {
String result="{'code':200,'status':'success','message':'success','data':[{'vid':'b5dd6d8e21cb480a394d522b3f125d7c_b','duration':'00:00:15'}]}";
JSONObject jsonObject = JSONObject.parseObject(result);
JSONArray jsonArray = jsonObject.getJSONArray("data");
String string = jsonArray.getString(0);
JSONObject fromObject = JSONObject.parseObject(string);
String duration = fromObject.getString("duration");
String vid = fromObject.getString("vid");
System.out.println("duration:"+duration);
System.out.println("vid:"+vid);
}
运行main(),控制台打印输出如下所示:
OK,到此结束!