一、网络请求基础架构
在移动端自动化开发中,网络请求能力是连接本地脚本与云端服务的关键桥梁。Auto.js基于HTTP协议栈实现了完整的网络通信模块,支持同步/异步两种执行模式,开发者可通过http对象直接调用各类请求方法。
1.1 请求生命周期管理
每个网络请求都遵循完整的生命周期:
- 请求构造阶段:配置URL、参数、请求头等
- 网络传输阶段:建立TCP连接,发送请求报文
- 响应处理阶段:解析状态码、响应体、响应头
- 资源释放阶段:关闭连接,清理临时数据
建议通过封装统一的请求处理函数来管理生命周期,示例框架如下:
function safeRequest(config) {try {const res = http.get(config);if (res.statusCode !== 200) {throw new Error(`请求失败: ${res.statusCode}`);}return processResponse(res);} catch (e) {console.error("请求异常:", e);return null;}}
二、核心请求方法详解
2.1 基础GET请求实现
GET请求是最常用的数据获取方式,适用于查询类接口。关键实现要点:
- URL编码处理:自动处理中文参数
- 响应体解析:支持文本/二进制格式
- 状态码校验:必须检查200以外的状态
// 基础GET请求示例function fetchWebContent(url) {const res = http.get(url);if (res.statusCode === 200) {const contentLength = res.body.string().length;console.log(`获取成功,内容长度: ${contentLength}字节`);return res.body.string();} else {throw new Error(`HTTP错误: ${res.statusCode}`);}}// 调用示例try {const html = fetchWebContent("https://example.com");} catch (e) {toast(e.message);}
2.2 带参数的查询请求
当需要传递查询参数时,推荐使用buildQuery方法进行参数序列化:
// 构建带参数的GitHub搜索请求function searchRepositories(query, sortField) {const baseUrl = "https://api.github.com/search/repositories";const params = {q: query,sort: sortField,per_page: 10};const fullUrl = `${baseUrl}?${http.buildQuery(params)}`;const res = http.get(fullUrl);return JSON.parse(res.body.string());}// 调用示例const result = searchRepositories("autojs", "stars");console.log("搜索结果:", result.items[0].full_name);
2.3 POST请求双模式实现
POST请求支持表单数据和JSON数据两种传输格式:
表单数据提交
// 表单格式提交用户信息function submitFormData() {const formData = {username: "test_user",device: "autojs_client"};const res = http.post("https://httpbin.org/post", formData);const jsonRes = JSON.parse(res.body.string());console.log("表单提交结果:", jsonRes.form);}
JSON数据提交
// JSON格式提交认证信息function submitJsonData() {const authData = {user: "admin",pwd: "secure_password"};const res = http.postJson("https://httpbin.org/post", authData);const jsonRes = JSON.parse(res.body.string());console.log("JSON提交结果:", jsonRes.json);}
2.4 请求头高级定制
通过headers配置可以实现:
- 模拟浏览器访问
- 传递认证令牌
- 指定内容类型
// 带认证头的请求示例function fetchProtectedResource(token) {const headers = {"User-Agent": "AutoJS-Client/1.0","Authorization": `Bearer ${token}`,"Accept-Language": "zh-CN"};const res = http.get({url: "https://api.example.com/data",headers: headers});return JSON.parse(res.body.string());}
三、文件传输解决方案
3.1 多部分表单上传
文件上传需要使用multipart/form-data格式:
// 上传图片文件示例function uploadImage(filePath, description) {const fileStream = open(filePath);const formData = {file: fileStream,desc: description,timestamp: new Date().getTime()};const res = http.postMultipart("https://api.example.com/upload",formData);fileStream.close();return JSON.parse(res.body.string());}// 调用示例uploadImage("/sdcard/test.jpg", "测试图片上传");
3.2 大文件下载策略
对于大文件下载建议:
- 检查存储空间是否充足
- 使用流式处理避免内存溢出
- 添加进度回调机制
// 安全下载文件实现function downloadFileSafely(url, savePath) {// 检查存储空间const stat = files.stat(savePath);if (stat && stat.size > 100 * 1024 * 1024) {throw new Error("目标文件已存在且过大");}const res = http.get(url);if (res.statusCode === 200) {files.writeBytes(savePath, res.body.bytes());console.log("下载完成,保存至:", savePath);return true;}return false;}// 带进度监控的下载实现function downloadWithProgress(url, savePath, progressCallback) {// 此处可扩展为分块下载+进度计算// 实际实现需结合具体业务需求}
四、异常处理最佳实践
4.1 常见错误类型
| 错误类型 | 典型场景 | 处理策略 |
|---|---|---|
| 网络超时 | 弱网环境 | 设置合理超时时间 |
| 状态码异常 | 401未授权/404未找到 | 跳转登录/提示用户 |
| 解析错误 | 响应体格式不符 | 添加格式校验逻辑 |
| 存储错误 | 磁盘空间不足 | 提前检查存储状态 |
4.2 重试机制实现
// 带重试的请求封装function requestWithRetry(url, maxRetry = 3) {let lastError = null;for (let i = 0; i < maxRetry; i++) {try {const res = http.get(url);if (res.statusCode === 200) {return res.body.string();}lastError = new Error(`HTTP错误: ${res.statusCode}`);} catch (e) {lastError = e;}// 指数退避重试sleep(1000 * Math.pow(2, i));}throw lastError || new Error("未知错误");}
五、性能优化建议
- 连接复用:对同一主机的多次请求应复用TCP连接
- 数据压缩:启用Gzip压缩减少传输量
- 缓存策略:合理设置Cache-Control头
- 并发控制:避免同时发起过多请求
// 性能优化示例:启用压缩的请求function optimizedRequest(url) {const res = http.get({url: url,headers: {"Accept-Encoding": "gzip, deflate"}});// 此处应添加解压缩逻辑(Auto.js默认自动处理)return res.body.string();}
通过系统掌握这些网络编程技巧,开发者可以构建出稳定高效的移动端自动化应用,实现与各类云服务的无缝对接。在实际开发中,建议结合具体业务场景建立完善的网络请求中间件,统一处理认证、日志、重试等横切关注点。