前言
大家好,我是鲫小鱼。是一名不写前端代码
的前端工程师,热衷于分享非前端的知识,带领切图仔逃离切图圈子,欢迎关注我,微信公众号:《鲫小鱼不正经》
。欢迎点赞、收藏、关注,一键三连!!
第十二章:网络请求与数据交互
一、理论讲解: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());
2.4 设置请求头与 Cookie
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,避免无效等待
- 及时释放资源,防止内存泄漏
- 结果缓存,避免重复请求
- 关键节点加详细日志,便于追踪
- 适配移动端网络波动,自动切换备用接口
最后感谢阅读!欢迎关注我,微信公众号:
《鲫小鱼不正经》
。欢迎点赞、收藏、关注,一键三连!!!