uniapp+plus5实现java层网络请求
前言
最近香港服务器部署的抖音、皮皮虾等短视频解析的时候老是抽风。
于是就萌生起做一个简单的app在本地解析的想法。不会原生就只能从web for android入手了。
最关键是要实现更自由的网络请求,因为解析过程需要传递一些必要的头部数据。
资料
- uniapp 可以直接打包成apk
- uniapp 默认支持navite.js for android
实现网络请求
借助navite.js
function request(url, method = 'GET', data = null, allow_redirect = false, RequestProperty = {}) {
var javaURL = plus.android.newObject('java.net.URL', url);
var connection = plus.android.invoke(javaURL, 'openConnection');
plus.android.invoke(connection, 'setRequestMethod', method.toLocaleUpperCase());
plus.android.invoke(connection, 'setInstanceFollowRedirects', allow_redirect);
plus.android.invoke(connection, 'setConnectTimeout', 0);
plus.android.invoke(connection, 'setReadTimeout', 0);
// ua
plus.android.invoke(connection, 'setRequestProperty', 'User-Agent',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36'
);
for (var kk in RequestProperty) {
plus.android.invoke(connection, 'setRequestProperty', kk, RequestProperty[kk]);
}
if (method.toLocaleUpperCase() == 'POST') {
var param_str = '';
if (data && typeof data == 'object') {
var param_list = [];
for (var fk in data) {
param_list.push(fk + '=' + encodeURIComponent(data[fk]));
}
param_str = param_list.join('&');
} else if (data && typeof data == 'string') {
param_str = data;
}
plus.android.invoke(connection, 'setRequestProperty', 'Content-Type', 'application/x-www-form-urlencoded');
plus.android.invoke(connection, 'setDoOutput', true);
plus.android.invoke(connection, 'setDoInput', true);
var outstream = plus.android.invoke(connection, 'getOutputStream');
// post数据 实验失败 param一直没办法传过去
var OutputStreamWriter = plus.android.importClass('java.io.OutputStreamWriter');
var outwriter = new OutputStreamWriter(outstream);
outwriter.write(param_str);
outwriter.flush();
outwriter.close();
}
// 缓冲区读取
var reader = plus.android.newObject('java.io.BufferedReader', plus.android.newObject('java.io.InputStreamReader',
plus.android.invoke(connection, 'getInputStream')))
var status_code = plus.android.invoke(connection, 'getResponseCode');
var response = '';
var line;
while ((line = plus.android.invoke(reader, 'readLine')) != null) {
response += line;
}
return {
'data': response || '',
'status_code': status_code,
'info': connection,
};
}
注意事项
视频解析后保存的视频文件偶尔会失去文件后缀,如果需要补全后缀需要用plus5+来重命名文件。
示例:
var downloadTask = uni.downloadFile({
url: fileurl,
success(res) {
var tmpath = res.tempFilePath;
// 暂时以时间戳ms命名
var newname = (new Date().getTime()) + ".mp4";
// 读取临时文件实例
plus.io.resolveLocalFileSystemURL(tmpath, (entry) => {
// 在当前目录改名
entry.getParent((direntry) => {
// 改名 新的文件名一定要加上斜杠
entry.moveTo(direntry, '/' + newname, (nentry) => {
console.log("New Path: " + nentry.toURL());
uni.saveVideoToPhotosAlbum({
filePath: nentry.toURL(), //务必转换成相对路径
success(res) {
that.reset_progress();
uni.showToast({
title: '下载成功',
});
},
fail() {
that.reset_progress();
uni.showToast({
title: '临时文件迁移失败,请重试',
icon: 'none'
})
}
})
}, (e) => {
that.reset_progress();
console.log(e)
uni.showToast({
icon: 'none',
title: '重命名失败,请重试'
})
})
}, (e) => {
that.reset_progress();
uni.showToast({
icon: 'none',
title: '临时文件目录读取失败,请重试'
})
})
}, (e) => {
that.reset_progress();
console.log(e)
uni.showToast({
icon: 'none',
title: '临时文件读取失败'
})
});
},
fail() {
that.reset_progress();
uni.hideToast()
uni.showToast({
title: '下载失败,请重试',
icon: 'none'
})
}
});
downloadTask.onProgressUpdate((res) => {
uni.hideToast()
this.progress = res.progress;
this.progress_style = {
width: this.progress + '%'
};
});
陷入回调地狱了。。。
成果
微博的解析还有点问题,主要是plus5+post的问题。
uniapp+plus5实现java层网络请求
http://blog.icy8.cn/posts/37781/