Auto.js 入门指南(十二)网络请求与数据交互

前言

大家好,我是鲫小鱼。是一名不写前端代码的前端工程师,热衷于分享非前端的知识,带领切图仔逃离切图圈子,欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!

第十二章:网络请求与数据交互


一、理论讲解:HTTP、API 与网络通信原理

1.1 HTTP 基础

  • HTTP(超文本传输协议)是 Web 通信的基础,Auto.js 内置 http 模块,支持 get/post/put/delete 等常用请求。
  • 常见场景:数据上报、接口测试、自动签到、文件上传下载、远程控制等。

1.2 API 调用流程

  • 构造请求(URL、参数、Header)
  • 发送请求(同步/异步)
  • 处理响应(JSON/XML/文本/二进制)
  • 错误处理与重试
  • 数据加密与安全

1.3 网络通信原理

  • 客户端与服务器通过 TCP/IP 协议通信
  • 请求-响应模型:客户端发起请求,服务器返回响应
  • 常见数据格式:JSON、XML、表单、二进制
  • 网络安全:HTTPS、Token、签名、加密

二、代码示例:Auto.js 网络请求全场景实战

2.1 基础 GET 请求

javascript 复制代码
// 简单 GET 请求,获取网页内容
var res = http.get("https://www.baidu.com");
if(res.statusCode == 200){
    log("请求成功,内容长度:" + res.body.string().length);
} else {
    log("请求失败,状态码:" + res.statusCode);
}

2.2 带参数的 GET 请求

javascript 复制代码
// 带参数 GET 请求
var url = "https://api.github.com/search/repositories";
var params = { q: "autojs", sort: "stars" };
var res = http.get(url + "?" + http.buildQuery(params));
log(res.body.string());

2.3 POST 请求(表单/JSON)

javascript 复制代码
// 表单 POST
var res = http.post("https://httpbin.org/post", { name: "鲫小鱼", type: "autojs" });
log(res.body.string());

// JSON POST
var res2 = http.postJson("https://httpbin.org/post", { user: "fish", pwd: "123456" });
log(res2.body.string());
javascript 复制代码
// 自定义 Header
var res = http.get({
    url: "https://httpbin.org/headers",
    headers: { "User-Agent": "Autojs/1.0", "Cookie": "token=abc123" }
});
log(res.body.string());

2.5 文件上传与下载

javascript 复制代码
// 文件上传(multipart/form-data)
var filePath = "/sdcard/test.jpg";
var res = http.postMultipart("https://httpbin.org/post", {
    file: open(filePath),
    desc: "图片描述"
});
log(res.body.string());

// 文件下载
var url = "https://www.example.com/test.apk";
var savePath = "/sdcard/test.apk";
var res = http.get(url);
if(res.statusCode == 200){
    files.writeBytes(savePath, res.body.bytes());
    toast("下载完成");
}

2.6 异步请求与回调

javascript 复制代码
// 异步 GET
http.get("https://api.github.com", {}, function(res, err){
    if(err){
        log("请求失败:" + err);
        return;
    }
    log("异步请求成功,状态码:" + res.statusCode);
});

2.7 Promise 封装与链式处理

javascript 复制代码
// Promise 封装 http 请求
function getAsync(url){
    return new Promise((resolve, reject) => {
        http.get(url, {}, function(res, err){
            if(err) reject(err);
            else resolve(res);
        });
    });
}
getAsync("https://api.github.com").then(res => {
    log("Promise 成功,内容长度:" + res.body.string().length);
}).catch(err => {
    log("Promise 失败:" + err);
});

2.8 多线程并发请求

javascript 复制代码
// 多线程批量请求
var urls = [
    "https://httpbin.org/get?a=1",
    "https://httpbin.org/get?a=2",
    "https://httpbin.org/get?a=3"
];
urls.forEach(url => {
    threads.start(function(){
        var res = http.get(url);
        log(url + " 状态码:" + res.statusCode);
    });
});

2.9 错误重试与超时处理

javascript 复制代码
// 带重试的 GET 请求
function getWithRetry(url, retry=3){
    for(let i=0;i<retry;i++){
        try{
            var res = http.get(url);
            if(res.statusCode == 200) return res;
        }catch(e){
            log("第"+(i+1)+"次请求失败:"+e);
        }
        sleep(1000);
    }
    throw new Error("请求失败");
}
try{
    var res = getWithRetry("https://api.github.com");
    log("重试成功,内容长度:" + res.body.string().length);
}catch(e){
    log("最终失败:"+e);
}

2.10 处理 JSON/XML/二进制数据

javascript 复制代码
// 处理 JSON
var res = http.get("https://api.github.com/repos/hyb1996/Auto.js");
var obj = JSON.parse(res.body.string());
log("项目名称:" + obj.name);

// 处理二进制
var res2 = http.get("https://www.example.com/logo.png");
var bytes = res2.body.bytes();
log("图片字节长度:" + bytes.length);

2.11 网络监控与状态检测

javascript 复制代码
// 检查网络是否可用
function isNetworkAvailable(){
    try{
        var res = http.get("https://www.baidu.com");
        return res.statusCode == 200;
    }catch(e){
        return false;
    }
}
if(isNetworkAvailable()){
    toast("网络正常");
}else{
    toast("网络异常");
}

2.12 数据加密与安全传输

javascript 复制代码
// 简单加密(Base64)
function encodeBase64(str){
    return java.util.Base64.getEncoder().encodeToString(java.lang.String(str).getBytes());
}
var data = { user: "fish", pwd: "123456" };
var enc = encodeBase64(JSON.stringify(data));
log("加密后:" + enc);

// HTTPS 请求
var res = http.get("https://httpbin.org/get");
log("HTTPS 状态码:" + res.statusCode);

2.13 进阶:自定义请求模块

javascript 复制代码
// modules/net.js
function request(opt){
    var method = (opt.method||"GET").toUpperCase();
    var url = opt.url;
    var headers = opt.headers||{};
    var data = opt.data||null;
    var timeout = opt.timeout||10000;
    var res;
    if(method=="GET"){
        res = http.get({url, headers, timeout});
    }else if(method=="POST"){
        if(opt.json){
            res = http.postJson(url, data, {headers, timeout});
        }else{
            res = http.post(url, data, {headers, timeout});
        }
    }
    return res;
}
module.exports = { request };

// 使用自定义模块
var net = require("./modules/net.js");
var res = net.request({
    method: "POST",
    url: "https://httpbin.org/post",
    data: { a: 1, b: 2 },
    json: true
});
log(res.body.string());

三、实战项目:自动签到数据上报与接口自动化测试

3.1 项目需求

  • 自动签到后,将结果通过 HTTP POST 上报到服务器
  • 支持接口自动化测试,批量请求并校验响应
  • 支持数据同步与本地缓存

3.2 项目结构

plaintext 复制代码
autojs-netdemo/
├── main.js
├── modules/
│   ├── net.js
│   └── logger.js
├── data/
│   └── cache.json
├── logs/
│   └── net.log
└── README.md

3.3 net.js 网络模块

javascript 复制代码
// modules/net.js
function postSigninResult(data){
    var url = "https://httpbin.org/post";
    var res = http.postJson(url, data);
    return res.statusCode == 200;
}
function batchTest(urls){
    return urls.map(url => {
        var res = http.get(url);
        return { url, code: res.statusCode };
    });
}
function syncData(remoteUrl, localPath){
    var res = http.get(remoteUrl);
    if(res.statusCode==200){
        files.write(localPath, res.body.string());
        return true;
    }
    return false;
}
module.exports = { postSigninResult, batchTest, syncData };

3.4 main.js 主流程

javascript 复制代码
// main.js
const net = require("./modules/net.js");
const logger = require("./modules/logger.js");

// 自动签到并上报
var result = { user: "fish", time: Date.now(), status: "success" };
if(net.postSigninResult(result)){
    logger.log("签到结果上报成功");
}else{
    logger.log("签到结果上报失败");
}

// 批量接口测试
var urls = [
    "https://httpbin.org/get?a=1",
    "https://httpbin.org/get?a=2"
];
var testResults = net.batchTest(urls);
testResults.forEach(r => logger.log(r.url + " code=" + r.code));

// 数据同步
if(net.syncData("https://httpbin.org/json", "../data/cache.json")){
    logger.log("数据同步成功");
}else{
    logger.log("数据同步失败");
}

3.5 logger.js 日志模块

javascript 复制代码
// modules/logger.js
function log(msg) {
    let line = `[${new Date().toLocaleTimeString()}] ${msg}`;
    files.append("../logs/net.log", line + "\n");
    toast(msg);
}
module.exports = { log };

3.6 cache.json 示例

json 复制代码
[
  { "user": "fish", "time": 1710000000000, "status": "success" },
  { "user": "cat", "time": 1710000001000, "status": "fail" }
]

四、常见问题与解决方案

问题 解决方案
请求超时/无响应 检查网络、增加超时、重试机制、切换备用接口
状态码异常/数据格式错误 检查接口文档、调试参数、加日志输出
文件上传失败/下载不完整 检查文件路径、权限、分片上传、断点续传
异步回调未执行/丢失 检查回调函数、网络状态、异常捕获
数据加密/解密失败 检查加密算法、密钥、数据格式
多线程冲突/数据覆盖 用锁、队列、分片处理,避免并发写入
HTTPS 证书错误 检查服务器证书、信任策略、降级为 HTTP 测试
服务器返回乱码/编码异常 检查编码格式、加解码参数、日志输出
本地缓存丢失/同步失败 检查文件路径、权限、同步逻辑
网络监控误报/漏报 优化检测逻辑、增加多点检测、日志分析
数据泄露/安全风险 敏感信息加密、Token 校验、HTTPS 传输
频繁请求被封/限流 增加请求间隔、IP 轮换、错误重试
兼容性问题 适配不同 Android 版本、网络环境、接口协议

五、性能优化建议

  • 合理设置超时与重试,避免卡死
  • 批量请求用多线程/队列,提升效率
  • 合理缓存数据,减少重复请求
  • 日志分级输出,便于排查问题
  • 异步处理耗时操作,主线程只做调度
  • 文件上传下载分片/断点续传,提升稳定性
  • 数据加密压缩,减少流量消耗
  • 网络监控与自动恢复,提升健壮性
  • 适配不同网络环境,提升兼容性
  • 合理 sleep,避免无效等待
  • 及时释放资源,防止内存泄漏
  • 结果缓存,避免重复请求
  • 关键节点加详细日志,便于追踪
  • 适配移动端网络波动,自动切换备用接口

最后感谢阅读!欢迎关注我,微信公众号:《鲫小鱼不正经》。欢迎点赞、收藏、关注,一键三连!!!

相关推荐
AD钙奶-lalala3 小时前
android:foregroundServiceType详解
android
小满zs3 小时前
Zustand 第五章(订阅)
前端·react.js
涵信4 小时前
第一节 基础核心概念-TypeScript与JavaScript的核心区别
前端·javascript·typescript
谢尔登4 小时前
【React】常用的状态管理库比对
前端·spring·react.js
编程乐学(Arfan开发工程师)4 小时前
56、原生组件注入-原生注解与Spring方式注入
java·前端·后端·spring·tensorflow·bug·lua
小公主4 小时前
JavaScript 柯里化完全指南:闭包 + 手写 curry,一步步拆解原理
前端·javascript
大胃粥6 小时前
Android V app 冷启动(13) 焦点窗口更新
android
姑苏洛言6 小时前
如何解决答题小程序大小超过2M的问题
前端
GISer_Jing7 小时前
JWT授权token前端存储策略
前端·javascript·面试
开开心心就好7 小时前
电脑扩展屏幕工具
java·开发语言·前端·电脑·php·excel·batch