| |  |  |  |  |  | 
                                
 //方法1
 /**
 * OKHTTP工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-09
 */
 
 var OKHTTP = {
 /**
 * 发送HTTP GET请求
 * @param {string} url 请求地址
 * @param {string} [key] 请求头参数名
 * @param {string} [value] 请求头参数值
 * @param {string} [code='UTF-8'] 请求编码
 * @returns {string|null} 响应内容或null(错误时)
 */
 get请求: function(url, key, value, code) {
 try {
 // 基本参数校验
 if (typeof url !== 'string') return null;
 
 // 构建请求
 var conn = new java.net.URL(url).openConnection();
 conn.setRequestMethod("GET");
 
 // 设置请求头
 if (key && value) {
 conn.setRequestProperty(key, value);
 }
 
 // 设置编码
 var encoding = code || 'UTF-8';
 conn.setRequestProperty("Accept-Charset", encoding);
 
 // 获取响应
 var responseCode = conn.getResponseCode();
 if (responseCode >= 200 && responseCode < 300) {
 var inStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getInputStream(), encoding)
 );
 var inputLine;
 var response = new java.lang.StringBuffer();
 while ((inputLine = inStream.readLine()) != null) {
 response.append(inputLine);
 }
 inStream.close();
 return response.toString();
 } else {
 printl("[GET请求错误] 状态码: " + responseCode);
 return null;
 }
 } catch (e) {
 printl("[GET请求异常] " + e.message);
 return null;
 }
 }
 };
 
 // 测试示例
 printl("=== HTTP GET测试 ===");
 var 请求头名 = 'User-Agent';
 var 请求头值 = 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36 QIHU 360SE/13.1.6380.0';
 var 请求地址 = 'https://www.baidu.com';
 var 请求编码 = 'UTF-8';
 var ret = OKHTTP.get请求(请求地址, 请求头名, 请求头值, 请求编码);
 if (ret) {
 printl("请求成功,返回内容:");
 printl(ret);
 } else {
 printl("请求失败");
 }
 //方法2
 
 /**
 * 字符串工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-02
 */
 
 var OKHTTP = {
 // 原有方法保持不变...
 
 json请求: function(url, data, key, value, code) {
 try {
 // 增强参数校验
 if (typeof url !== 'string' || !url.startsWith('http')) {
 printl("[参数错误] 无效的URL");
 return null;
 }
 if (typeof data !== 'string') {
 printl("[参数错误] 数据必须是字符串");
 return null;
 }
 
 // 调试输出请求信息
 printl("[请求调试] 目标URL: " + url);
 printl("[请求调试] 请求数据: " + data.substring(0, Math.min(data.length, 100)) +
 (data.length > 100 ? "..." : ""));
 
 var conn = new java.net.URL(url).openConnection();
 conn.setRequestMethod("POST");
 conn.setDoOutput(true);
 conn.setConnectTimeout(5000);
 
 // 设置编码和头信息
 var encoding = code || "UTF-8";
 conn.setRequestProperty("Content-Type", "application/json; charset=" + encoding);
 conn.setRequestProperty("Accept", "application/json; charset=" + encoding);
 
 if (key && value) {
 conn.setRequestProperty(key, value);
 printl("[请求调试] 设置请求头: " + key + ": " + value);
 }
 
 // 修正:使用Java的String类处理编码
 var javaString = new java.lang.String(data);
 var bytes = javaString.getBytes(encoding);
 
 // 发送请求
 var outStream = conn.getOutputStream();
 outStream.write(bytes);
 outStream.flush();
 outStream.close();
 
 // 处理响应
 var responseCode = conn.getResponseCode();
 printl("[响应调试] 状态码: " + responseCode);
 
 if (responseCode >= 200 && responseCode < 300) {
 var inStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getInputStream(), encoding)
 );
 var response = new java.lang.StringBuffer();
 var line;
 while ((line = inStream.readLine()) != null) {
 response.append(line);
 }
 inStream.close();
 
 var responseText = response.toString();
 printl("[响应调试] 响应长度: " + responseText.length);
 return responseText;
 } else {
 var errStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getErrorStream(), encoding)
 );
 var errorResponse = new java.lang.StringBuffer();
 while ((line = errStream.readLine()) != null) {
 errorResponse.append(line);
 }
 errStream.close();
 
 printl("[响应错误] 状态码: " + responseCode);
 printl("[响应错误] 错误详情: " + errorResponse.toString());
 return null;
 }
 } catch (e) {
 printl("[请求异常] " + e.toString());
 return null;
 }
 }
 };
 
 // 测试示例
 printl("=== 修复版中文JSON测试 ===");
 var 测试数据 = JSON.stringify({
 timestamp: new Date().getTime(),
 test: "中文测试修复版",
 data: "这里是没有乱码的中文内容"
 });
 
 var ret = OKHTTP.json请求(
 'https://postman-echo.com/post',
 测试数据,
 'User-Agent',
 'Mozilla/5.0'
 );
 
 if (ret) {
 printl("测试成功,响应数据:");
 printl(ret);
 } else {
 printl("测试失败");
 }
 //方法3
 
 /**
 * 字符串工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-02
 */
 
 var OKHTTP = {
 // 原有方法保持不变...
 
 /**
 * 发送表单POST请求
 * @param {string} url 请求地址
 * @param {string|Object} map 表单数据(map对象或查询字符串)
 * @param {string} [key] 请求头参数名
 * @param {string} [value] 请求头参数值
 * @param {string} [code='UTF-8'] 请求编码
 * @returns {string|null} 响应内容或null(错误时)
 */
 post请求: function(url, map, key, value, code) {
 try {
 // 参数校验
 if (typeof url !== 'string' || !url.startsWith('http')) {
 printl("[参数错误] 无效的URL");
 return null;
 }
 
 // 处理map参数
 var formData = '';
 if (typeof map === 'string') {
 formData = map;
 } else if (typeof map === 'object') {
 // 将map对象转换为查询字符串
 for (var k in map) {
 if (map.hasOwnProperty(k)) {
 if (formData) formData += '&';
 formData += encodeURIComponent(k) + '=' + encodeURIComponent(map[k]);
 }
 }
 } else {
 printl("[参数错误] map必须是字符串或对象");
 return null;
 }
 
 // 调试输出
 printl("[POST请求调试] 目标URL: " + url);
 printl("[POST请求调试] 表单数据: " + formData.substring(0, 100) + (formData.length > 100 ? "..." : ""));
 
 var conn = new java.net.URL(url).openConnection();
 conn.setRequestMethod("POST");
 conn.setDoOutput(true);
 conn.setConnectTimeout(5000);
 
 // 设置编码和头信息
 var encoding = code || "UTF-8";
 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + encoding);
 
 if (key && value) {
 conn.setRequestProperty(key, value);
 printl("[POST请求调试] 设置请求头: " + key + ": " + value);
 }
 
 // 发送请求数据
 var outStream = new java.io.DataOutputStream(conn.getOutputStream());
 outStream.writeBytes(formData);
 outStream.flush();
 outStream.close();
 
 // 处理响应
 var responseCode = conn.getResponseCode();
 printl("[POST响应调试] 状态码: " + responseCode);
 
 if (responseCode >= 200 && responseCode < 300) {
 var inStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getInputStream(), encoding)
 );
 var response = new java.lang.StringBuffer();
 var line;
 while ((line = inStream.readLine()) != null) {
 response.append(line);
 }
 inStream.close();
 
 var responseText = response.toString();
 printl("[POST响应调试] 响应长度: " + responseText.length);
 return responseText;
 } else {
 var errStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getErrorStream(), encoding)
 );
 var errorResponse = new java.lang.StringBuffer();
 while ((line = errStream.readLine()) != null) {
 errorResponse.append(line);
 }
 errStream.close();
 
 printl("[POST响应错误] 状态码: " + responseCode);
 printl("[POST响应错误] 错误详情: " + errorResponse.toString());
 return null;
 }
 } catch (e) {
 printl("[POST请求异常] " + e.toString());
 return null;
 }
 }
 };
 
 // 测试示例
 printl("=== POST请求测试 ===");
 var 测试数据 = {
 a: 1,
 b: 2,
 c: "中文测试"
 };
 
 var ret = OKHTTP.post请求(
 'https://postman-echo.com/post',
 测试数据,
 'User-Agent',
 'Mozilla/5.0'
 );
 
 if (ret) {
 printl("测试成功,响应数据:");
 printl(ret);
 } else {
 printl("测试失败");
 }
 //方法4
 
 /**
 * 字符串工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-02
 */
 
 var OKHTTP = {
 // 原有方法保持不变...
 
 post请求表单: function(url, map, key, value, code) {
 try {
 // 参数校验
 if (typeof url !== 'string' || !url.startsWith('http')) {
 printl("[参数错误] 无效的URL");
 return null;
 }
 
 // 处理map参数
 var formData = '';
 if (typeof map === 'string') {
 formData = map;
 } else if (typeof map === 'object') {
 var params = [];
 for (var k in map) {
 if (map.hasOwnProperty(k)) {
 var val = map[k];
 if (val !== null && val !== undefined) {
 params.push(
 encodeURIComponent(k) + '=' +
 encodeURIComponent(typeof val === 'object' ? JSON.stringify(val) : val)
 );
 }
 }
 }
 formData = params.join('&');
 } else {
 printl("[参数错误] map必须是字符串或对象");
 return null;
 }
 
 // 调试信息
 printl("[表单POST调试] 目标URL: " + url);
 printl("[表单POST调试] 表单数据: " + formData.substring(0, 100) + (formData.length > 100 ? "..." : ""));
 
 var conn = new java.net.URL(url).openConnection();
 conn.setRequestMethod("POST");
 conn.setDoOutput(true);
 conn.setConnectTimeout(8000);
 conn.setReadTimeout(10000);
 
 // 设置编码和头信息
 var encoding = code || "UTF-8";
 conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded; charset=" + encoding);
 
 if (key && value) {
 conn.setRequestProperty(key, value);
 printl("[表单POST调试] 设置请求头: " + key + ": " + value);
 }
 
 // 修正:使用Java String类处理编码
 var javaString = new java.lang.String(formData);
 var outStream = conn.getOutputStream();
 outStream.write(javaString.getBytes(encoding));
 outStream.flush();
 outStream.close();
 
 // 处理响应
 var responseCode = conn.getResponseCode();
 printl("[表单POST响应] 状态码: " + responseCode);
 
 if (responseCode >= 200 && responseCode < 300) {
 var inStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getInputStream(), encoding)
 );
 var response = new java.lang.StringBuffer();
 var line;
 while ((line = inStream.readLine()) != null) {
 response.append(line);
 }
 inStream.close();
 
 var responseText = response.toString();
 printl("[表单POST响应] 响应长度: " + responseText.length);
 return responseText;
 } else {
 var errStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getErrorStream(), encoding)
 );
 var errorResponse = new java.lang.StringBuffer();
 while ((line = errStream.readLine()) != null) {
 errorResponse.append(line);
 }
 errStream.close();
 
 printl("[表单POST错误] 错误响应: " + errorResponse.toString());
 return null;
 }
 } catch (e) {
 printl("[表单POST异常] " + e.toString());
 return null;
 }
 }
 };
 
 // 测试示例
 printl("=== 表单POST修复测试 ===");
 var 测试数据 = {
 username: "张三",
 age: 25,
 skills: ["编程","测试"],
 meta: {vip: true}
 };
 
 var ret = OKHTTP.post请求表单(
 'https://postman-echo.com/post',
 测试数据,
 'User-Agent',
 'Mozilla/5.0'
 );
 
 if (ret) {
 printl("测试成功,响应数据:");
 printl(ret);
 } else {
 printl("测试失败");
 }
 //方法5
 
 /**
 * 字符串工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-02
 */
 
 var OKHTTP = {
 // 原有方法保持不变...
 
 /**
 * 上传文件到服务器
 * @param {string} url 请求地址
 * @param {string} parameter 文件参数名
 * @param {string} path 文件路径
 * @param {string|Object} map 附加表单数据
 * @param {string} [key] 请求头参数名
 * @param {string} [value] 请求头参数值
 * @param {string} [code='UTF-8'] 请求编码
 * @returns {string|null} 响应内容或null(错误时)
 */
 上传文件: function(url, parameter, path, map, key, value, code) {
 try {
 // 参数校验
 if (typeof url !== 'string' || !url.startsWith('http')) {
 printl("[参数错误] 无效的URL");
 return null;
 }
 if (typeof path !== 'string') {
 printl("[参数错误] 无效的文件路径");
 return null;
 }
 
 // 准备表单数据
 var formData = '';
 if (map) {
 if (typeof map === 'string') {
 formData = map;
 } else if (typeof map === 'object') {
 var params = [];
 for (var k in map) {
 if (map.hasOwnProperty(k)) {
 params.push(
 encodeURIComponent(k) + '=' +
 encodeURIComponent(map[k])
 );
 }
 }
 formData = params.join('&');
 }
 }
 
 // 调试信息
 printl("[文件上传调试] 目标URL: " + url);
 printl("[文件上传调试] 文件参数: " + parameter);
 printl("[文件上传调试] 文件路径: " + path);
 if (formData) {
 printl("[文件上传调试] 附加数据: " + formData.substring(0, 50) + (formData.length > 50 ? "..." : ""));
 }
 
 // 创建多部分请求
 var boundary = "----WebKitFormBoundary" + java.lang.System.currentTimeMillis();
 var conn = new java.net.URL(url).openConnection();
 conn.setRequestMethod("POST");
 conn.setDoOutput(true);
 conn.setConnectTimeout(10000);
 conn.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary);
 
 if (key && value) {
 conn.setRequestProperty(key, value);
 printl("[文件上传调试] 设置请求头: " + key + ": " + value);
 }
 
 var outStream = new java.io.DataOutputStream(conn.getOutputStream());
 var encoding = code || "UTF-8";
 var lineEnd = "\r\n";
 var twoHyphens = "--";
 
 // 写入表单数据
 if (formData) {
 var parts = formData.split('&');
 for (var i = 0; i < parts.length; i++) {
 var part = parts.split('=');
 if (part.length === 2) {
 outStream.writeBytes(twoHyphens + boundary + lineEnd);
 outStream.writeBytes('Content-Disposition: form-data; name="' +
 java.net.URLDecoder.decode(part[0], encoding) + '"' + lineEnd);
 outStream.writeBytes(lineEnd);
 outStream.writeBytes(java.net.URLDecoder.decode(part[1], encoding) + lineEnd);
 }
 }
 }
 
 // 写入文件数据
 var file = new java.io.File(path);
 if (file.exists()) {
 outStream.writeBytes(twoHyphens + boundary + lineEnd);
 outStream.writeBytes('Content-Disposition: form-data; name="' + parameter + '"; filename="' + file.getName() + '"' + lineEnd);
 outStream.writeBytes('Content-Type: application/octet-stream' + lineEnd);
 outStream.writeBytes(lineEnd);
 
 var fileInput = new java.io.FileInputStream(file);
 var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);
 var bytesRead;
 while ((bytesRead = fileInput.read(buffer)) != -1) {
 outStream.write(buffer, 0, bytesRead);
 }
 fileInput.close();
 outStream.writeBytes(lineEnd);
 } else {
 printl("[文件错误] 文件不存在: " + path);
 return null;
 }
 
 // 结束标记
 outStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);
 outStream.flush();
 outStream.close();
 
 // 处理响应
 var responseCode = conn.getResponseCode();
 printl("[文件上传响应] 状态码: " + responseCode);
 
 if (responseCode >= 200 && responseCode < 300) {
 var inStream = new java.io.BufferedReader(
 new java.io.InputStreamReader(conn.getInputStream(), encoding)
 );
 var response = new java.lang.StringBuffer();
 var line;
 while ((line = inStream.readLine()) != null) {
 response.append(line);
 }
 inStream.close();
 
 var responseText = response.toString();
 printl("[文件上传成功] 响应长度: " + responseText.length);
 return responseText;
 } else {
 printl("[文件上传错误] 服务器返回错误");
 return null;
 }
 } catch (e) {
 printl("[文件上传异常] " + e.toString());
 return null;
 }
 }
 };
 
 // 测试示例
 printl("=== 文件上传测试 ===");
 var ret = OKHTTP.上传文件(
 'https://postman-echo.com/post',
 'myFile',
 '/sdcard/test.jpg',
 {desc: '测试文件', type: 'image/jpeg'},
 'User-Agent',
 'Mozilla/5.0'
 );
 
 if (ret) {
 printl("上传成功,服务器响应:");
 printl(ret);
 } else {
 printl("上传失败");
 }
 //方法6
 
 /**
 * 字符串工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-02
 */
 
 var OKHTTP = {
 // 原有方法保持不变...
 
 /**
 * 下载网络文件到本地
 * @param {string} url 文件URL地址
 * @param {string} path 本地保存路径
 * @param {string} [key] 请求头参数名
 * @param {string} [value] 请求头参数值
 * @param {string} [code='UTF-8'] 请求编码
 * @returns {string|null} 下载文件路径或null(失败时)
 */
 下载文件: function(url, path, key, value, code) {
 try {
 // 参数校验
 if (typeof url !== 'string' || !url.startsWith('http')) {
 printl("[参数错误] 无效的URL");
 return null;
 }
 if (typeof path !== 'string') {
 printl("[参数错误] 无效的保存路径");
 return null;
 }
 
 // 调试信息
 printl("[文件下载调试] 资源URL: " + url);
 printl("[文件下载调试] 保存路径: " + path);
 
 var conn = new java.net.URL(url).openConnection();
 conn.setRequestMethod("GET");
 conn.setConnectTimeout(10000);
 conn.setReadTimeout(30000);
 
 // 设置请求头
 if (key && value) {
 conn.setRequestProperty(key, value);
 printl("[文件下载调试] 设置请求头: " + key + ": " + value);
 }
 
 // 获取文件流
 var inStream = conn.getInputStream();
 var file = new java.io.File(path);
 
 // 确保目录存在
 file.getParentFile().mkdirs();
 
 // 写入文件
 var outStream = new java.io.FileOutputStream(file);
 var buffer = java.lang.reflect.Array.newInstance(java.lang.Byte.TYPE, 4096);
 var bytesRead;
 var totalBytes = 0;
 
 while ((bytesRead = inStream.read(buffer)) != -1) {
 outStream.write(buffer, 0, bytesRead);
 totalBytes += bytesRead;
 }
 
 // 关闭流
 outStream.flush();
 outStream.close();
 inStream.close();
 
 printl("[文件下载完成] 文件大小: " + totalBytes + " bytes");
 return path;
 
 } catch (e) {
 printl("[文件下载异常] " + e.toString());
 return null;
 }
 }
 };
 
 // 测试示例
 printl("=== 文件下载测试 ===");
 var ret = OKHTTP.下载文件(
 'https://example.com/test.zip',
 '/sdcard/downloads/test.zip',
 'User-Agent',
 'Mozilla/5.0'
 );
 
 if (ret) {
 printl("文件下载成功,保存路径: " + ret);
 } else {
 printl("文件下载失败");
 }
 //方法7
 
 /**
 * 字符串工具模块 - 完整版
 * 适用:ES5系统安卓 JavaScript引擎Rhino
 * 最后更新:2025-04-02
 */
 
 var OKHTTP = {
 // 存储全局请求头
 _headers: {},
 
 // 原有方法保持不变...
 
 /**
 * 清除所有自定义请求头
 * @returns {boolean} 是否成功
 */
 清除header: function() {
 try {
 // 统计被清除的header数量
 var count = Object.keys(this._headers).length;
 
 // 清空headers对象
 this._headers = {};
 
 printl("[header清除] 已移除 " + count + " 个请求头");
 return true;
 } catch (e) {
 printl("[header清除异常] " + e.toString());
 return false;
 }
 },
 
 // 修改原有方法,使用_headers存储请求头
 get请求: function(url, key, value, code) {
 try {
 var conn = new java.net.URL(url).openConnection();
 // 应用全局headers
 for (var h in this._headers) {
 conn.setRequestProperty(h, this._headers[h]);
 }
 // ...其余代码不变
 } catch(e) { /* ... */ }
 },
 
 // 其他方法也做类似修改...
 };
 
 // 测试示例
 printl("=== header清除测试 ===");
 OKHTTP._headers = {
 'User-Agent': 'TestAgent',
 'X-Token': '123456'
 };
 printl("清除前header数: " + Object.keys(OKHTTP._headers).length);
 var result = OKHTTP.清除header();
 printl("清除结果: " + result);
 printl("清除后header数: " + Object.keys(OKHTTP._headers).length);
 
1. 模块概述OKHTTP工具模块是一个用于在ES5系统安卓JavaScript引擎Rhino环境下发送HTTP请求的工具集。它提供了多种HTTP请求方法,包括GET请求、JSON请求、表单POST请求、文件上传和下载等。每个方法都包含了参数校验、请求构建、响应处理以及异常捕获等逻辑,以确保请求的稳定性和可靠性。 2. 主要功能2.1 GET请求功能:发送HTTP GET请求到指定URL,并返回响应内容。参数:
 url:请求地址。key:请求头参数名(可选)。value:请求头参数值(可选)。code:请求编码,默认为'UTF-8'(可选)。
 2.2 JSON请求功能:发送JSON格式的POST请求到指定URL,并返回响应内容。参数:
 url:请求地址。data:JSON格式的请求数据。key:请求头参数名(可选)。value:请求头参数值(可选)。code:请求编码,默认为'UTF-8'(可选)。
 2.3 表单POST请求功能:发送表单数据的POST请求到指定URL,并返回响应内容。参数:
 url:请求地址。map:表单数据,可以是字符串或对象。key:请求头参数名(可选)。value:请求头参数值(可选)。code:请求编码,默认为'UTF-8'(可选)。
 2.4 文件上传功能:上传文件到指定服务器,并返回响应内容。参数:
 url:请求地址。parameter:文件参数名。path:文件路径。map:附加表单数据,可以是字符串或对象(可选)。key:请求头参数名(可选)。value:请求头参数值(可选)。code:请求编码,默认为'UTF-8'(可选)。
 2.5 文件下载功能:从指定URL下载文件到本地,并返回保存路径。参数:
 url:文件URL地址。path:本地保存路径。key:请求头参数名(可选)。value:请求头参数值(可选)。code:请求编码,默认为'UTF-8'(可选)。
 2.6 清除所有自定义请求头功能:清除存储的全局请求头。返回值:是否成功清除请求头。
 3. 示例分析每个方法都提供了详细的测试示例,包括请求参数的设置、请求的发送以及响应的处理。这些示例不仅展示了如何使用这些方法,还提供了调试信息输出的示例,有助于开发者在开发过程中进行问题排查。. 
 |  |  |  |  |  | 
 |