尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

tts-server-android 脚本运行时 HTTP 客户端:http 对象 GET/POST 完整使用指南

tts-server-android 脚本运行时 HTTP 客户端:http 对象 GET/POST 完整使用指南 语音后端音频【免费下载链接】tts-server-android这是一个Android系统TTS应用内置微软演示接口可自定义HTTP请求可导入其他本地TTS引擎以及根据中文双引号的简单旁白/对话识别朗读 还有自动重试备用配置文本替换等更多功能。项目地址https://gitcode.com/GitHub_Trending/tt/tts-server-android点击查看免费下载导读本文围绕 tts-server-android 的 Rhino JavaScript 脚本运行时中内置的http全局对象展开讲解如何利用http.get与http.post发起 HTTP 请求、读取响应JSON / 文本 / 二进制以及如何构造 multipart/form-data 文件上传表单。读完本文你将掌握在插件、直链上传规则、语音数据拉取等场景下编写可复用的网络请求代码并能理解响应对象在底层OkHttp Rhino 桥接是如何实现的。本文的主体依据是仓库内置的运行时文档 http.md并结合其源码实现GlobalHttp.kt、NativeResponse.kt与测试脚本http_get.js 等进行深度验证与扩展。http对象在运行时中的定位tts-server-android 的脚本功能基于 Rhino JavaScript 引擎。在引擎启动时RhinoTopLevel会向全局作用域注册一系列内置对象其中就包括httplazyLoaded(GlobalUUID.NAME, GlobalUUID::class) lazyLoaded(GlobalFileSystem.NAME, GlobalFileSystem::class) lazyLoaded(GlobalHttp.NAME, GlobalHttp::class) lazyLoaded(GlobalWebview.NAME, GlobalWebview::class)见 RhinoTopLevel.kt。http对象由 GlobalHttp.kt 实现向脚本暴露两个方法http.get(url[, headers])—— GET 请求参数个数限定为 12http.post(url[, body[, headers]])—— POST 请求参数个数限定为 13。两个方法均通过ensureArgumentsLength校验参数个数若传参数量超出范围会直接报错。底层网络栈使用 OkHttp经com.drake.net.Net封装请求执行后返回一个桥接到 JavaScript 的Response对象。在真实业务中http常被用于拉取在线语音列表、请求 TTS 接口等。例如 tts.md 中的语音加载逻辑就使用http.get(url).text()下载 voices.jsononLoadData: function () { let jsonStr if (fs.exists(voices.json)) { jsonStr fs.readText(voices.json) } else { let url https://speech.platform.bing.com/consumer/speech/synthesize/readaloud/voices/list?trustedclienttoken token jsonStr http.get(url).text() fs.writeFile(voices.json, jsonStr) } voices JSON.parse(jsonStr) },GET 请求获取数据并读取响应基本用法与响应属性http.get的签名是http.get(url, headers?)。官方文档 http.md 给出的示例let resp http.get(https://reqres.in/api/users) console.log(url, resp.url) console.log(redirected, resp.redirected) console.log(isOK, resp.ok) console.log(status, resp.status) console.log(statusText, resp.statusText) console.log(headers, resp.headers) // 三选一 且不可重复调用 console.log(json, resp.json(true/*不检查状态码*/).data[0].avatar) // https://reqres.in/img/faces/1-image.jpg // console.log(bytes, resp.bytes()) // console.log(text, resp.text())响应对象暴露了以下属性与方法均可在脚本中直接使用成员类型含义源码依据url字符串请求最终 URLNativeResponse.ktredirected布尔是否发生过重定向NativeResponse.ktok布尔状态码是否为 2xxisSuccessfulNativeResponse.ktstatus数字HTTP 状态码NativeResponse.ktstatusText字符串状态描述文本NativeResponse.ktheaders对象响应头映射MapNativeResponse.ktjson(force?)方法将响应体解析为 JSONNativeResponse.kttext(force?)方法读取响应体为字符串NativeResponse.ktbytes(force?)方法读取响应体为字节数组NativeResponse.kt读取响应体的三个方法json()、text()、bytes()是响应体的三种读取方式三选一且不可重复调用。这是因为底层对应 OkHttp 的body?.string()/body?.bytes()响应体流只能消费一次参见 NativeResponse.kt 的实现。三个方法都接受一个可选布尔参数force传true如resp.json(true)不检查状态码无论请求成功与否都直接解析响应体不传或传false检查状态码非 2xx 时抛出异常Response failed: codexxx, messagexxx。以 GET 示例为例resp.json(true).data[0].avatar直接取到 JSON 中data数组第一项的avatar字段返回的是真实图片地址https://reqres.in/img/faces/1-image.jpg。POST 请求提交 JSON 数据基础用法http.post的签名是http.post(url, body?, headers?)。body 的形态决定了请求类型body 为字符串作为请求体直接发送此时应配合Content-Type头body 为对象Map自动构造 multipart/form-data 表单。官方文档 http.md 中的 JSON POST 示例let body { email: eve.holtreqres.in, password: cityslicka } let headers { Content-Type: application/json } let resp http.post(https://reqres.in/api/login, JSON.stringify(body), headers) let ret resp.json(true/*不检查状态码*/) console.log(ret[token]) // QpwL5tke4Pnpja7X4关键点由于 body 传的是字符串必须先用JSON.stringify(body)序列化并在 headers 中声明Content-Type: application/json。后端据此按 JSON 解析返回{ token: QpwL5tke4Pnpja7X4 }一类的登录结果脚本再通过resp.json(true)取出token字段。底层实现原理在 GlobalHttp.kt 的post实现中val contentType headers?.get(Content-Type)?.toString()?.toMediaType() // ... if (body is CharSequence) this.body body.toString().toRequestBody(contentType) else if (body is Map*, *) this.body postMultipart(multipart/form-data, body as MapCharSequence, Any).build()即Content-Type头会被提取出来作为 OkHttp 请求体的媒体类型字符串 body 走toRequestBody(contentType)Map 类型 body 走postMultipart构造 multipart 表单。请求发起前还会通过logger.debug { POST $url, $body, $headers }记录调试日志。POST multipart文件上传表单官方文档示例当需要上传文件如上传配置文件、上传语音时把 body 写成一个普通对象其中值为对象含body/fileName/contentType三个键的项会被识别为文件字段let txt Hello World! 这是一个文件名为hello.txt的内容 let partBody { fileToUpload: { // 文件类型的内容 body: txt, fileName: hello.txt, contentType: text/plain }, time: 1h, reqtype: fileupload, } let headers { Content-Type: multipart/form-data, User-Agent: PostmanRuntime-ApipostRuntime/1.1.0 } let resp http.post(https://catbox.moe/user/api.php, partBody) let ret resp.text()文件字段的三种 body 形态从 GlobalHttp.kt 的postMultipart实现可以看到文件字段的body支持三种类型body 类型转换方式File文件路径对象body.asRequestBody(mediaType)ByteArray字节数组body.toRequestBody(mediaType)String字符串body.toRequestBody(mediaType)其他body.toString().toRequestBody()无媒体类型每个文件字段由addFormDataPart(fieldName, fileName, requestBody)加入 multipart 体非对象类型的字段如上面的time: 1h、reqtype: fileupload则作为普通表单字段通过addFormDataPart(key, value)提交。复用封装上传配置的完整示例测试脚本 http_post_multipart.js 演示了将 multipart 上传封装为可复用函数、并把字符串内容作为文件体上传的写法let url https://sy.mgz6.com/shuyuan resp upload(url, config) console.log(resp.text()) function upload(url, config, extra) { let form { file:{ body: config, fileName: config.json, contentType: application/json, } } return http.post(url, form) }注意这里并未显式传 headers文件字段的contentType会被作为该文件分区的媒体类型使用不过若要完整保留 multipart 语义建议仍按官方示例显式声明Content-Type: multipart/form-data。测试验证AndroidTest 中的 HTTP 用例仓库在 ScriptTest.kt 中提供了三个与 HTTP 相关的仪器化测试直接运行 assets 下的脚本验证http对象的行为Test fun http() { evalFromAsset(http_get) } Test fun httpPost() { evalFromAsset(http_post) } Test fun httpPostMultipart() { evalFromAsset(http_post_multipart) }对应的脚本资产位于 lib-script/src/androidTest/assets/test/ 目录http_get.js、http_post.js、http_post_multipart.js内容与运行时文档示例保持一致并在脚本末尾注释了预期的响应 JSON 结构。同时ScriptTest.eval会为RhinoScriptEngine挂接日志监听器把脚本中的console.log输出转发到测试日志方便核对每个字段的实际值。常见问题与注意事项响应体只能读取一次json()/text()/bytes()三选一重复调用会因底层响应流已消费而失败。若不确定状态码可统一传true跳过状态检查再自行判断resp.ok/resp.status。JSON POST 必须序列化body 传普通对象会被当作 multipart 表单提交 JSON 时必须JSON.stringify(body)并配合Content-Type: application/json。文件字段三要素multipart 中要上传文件字段值必须是含body、fileName、contentType的对象body支持字符串、字节数组或文件对象。参数个数限制get最多 2 个参数、post最多 3 个参数超出会被ensureArgumentsLength拒绝。force参数的语义json(true)/text(true)/bytes(true)表示不校验状态码直接解析默认false则非 2xx 抛出异常便于在脚本中用 try/catch 处理错误分支。小结http对象是 tts-server-android 脚本运行时中与外部服务通信的核心工具http.get适合拉取语音列表、配置等只读数据http.post既能以 JSON 提交结构化数据也能通过 multipart 表单上传文件。其底层由 OkHttp 提供网络能力响应结果被封装为 Rhino 可调用的Response对象文档、源码与测试三者相互印证可直接在插件、直链上传规则及语音数据加载等脚本中复用本文示例。赞分享语音后端音频【免费下载链接】tts-server-android这是一个Android系统TTS应用内置微软演示接口可自定义HTTP请求可导入其他本地TTS引擎以及根据中文双引号的简单旁白/对话识别朗读 还有自动重试备用配置文本替换等更多功能。项目地址https://gitcode.com/GitHub_Trending/tt/tts-server-android点击查看免费下载相关推荐TTS Server Android 脚本运行时 WebSocket 客户端API 详解与插件 TTS 实战集成TTS Server Android 脚本运行时 WebSocket 客户端API 详解与插件 TTS 实战集成 本文围绕 TTS Server Androi语音后端音频brpc HTTP 客户端开发指南从 GET/POST 到渐进式下载的完整实践brpc HTTP 客户端开发指南从 GET/POST 到渐进式下载的完整实践 brpcbetter RPC是一款工业级 C RPC 框架其内置的RPC框架后端微服务网络通信tts-server-android 脚本运行时环境指南Console、fs 文件、HTTP 与 WebSocket 四大内置 API 全解析tts server android 脚本运行时环境指南Console、fs 文件、HTTP 与 WebSocket 四大内置 API 全解析 本篇指南以仓库语音后端音频上一篇OpenShell 主工程师评审方法论面向 AI Agent 沙箱的代码、计划与架构安全审查实战指南下一篇FlicFlac音频转换工具深度解析从轻量级设计到企业级音频处理解决方案创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表