uniapp+plus5实现java层网络请求

前言

最近香港服务器部署的抖音、皮皮虾等短视频解析的时候老是抽风。

于是就萌生起做一个简单的app在本地解析的想法。不会原生就只能从web for android入手了。

最关键是要实现更自由的网络请求,因为解析过程需要传递一些必要的头部数据。

资料

  1. uniapp 可以直接打包成apk
  2. 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/
作者
icy8
发布于
2021年2月9日
许可协议