更新记录
1.0.0(2026-10-29)
- 基于
leven-uts-http 的 leven_uts_httpd-release.aar 反编译重写为 UTS 原生混编插件
- 提供 5 个方法:
httpListener / startHttp / stopHttp / getIpAddress / sendData
- 纯 Kotlin 实现 HTTP 服务端核心,不依赖 fastjson 与 NanoHTTPD
- 移除原 aar 的试用期校验逻辑
- 修正请求体解析(支持 Content-Length 与 chunked),支持多请求并发响应
平台兼容性
uni-app(4.72)
| Vue2 |
Vue2插件版本 |
Vue3 |
Vue3插件版本 |
Chrome |
Safari |
app-vue |
app-vue插件版本 |
app-nvue |
app-nvue插件版本 |
Android |
Android插件版本 |
iOS |
鸿蒙 |
| √ |
1.0.0 |
√ |
1.0.0 |
× |
× |
√ |
1.0.0 |
√ |
1.0.0 |
5.0 |
1.0.0 |
× |
× |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| × |
× |
× |
× |
- |
× |
× |
× |
× |
- |
× |
× |
uni-app x(4.72)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| × |
× |
5.0 |
× |
× |
× |
插件介绍
安卓局域网 HTTP 服务端 UTS 原生插件。把手机变成一个局域网 HTTP 服务器,浏览器 / Postman / Apipost 等客户端可通过 http://<手机IP>:<端口>/xxx 访问本机接口,接口数据由业务层(UTS)动态返回。
支持 uni-app 与 uni-app x,纯 Kotlin 原生混编实现,不依赖任何三方库。
使用场景
- 浏览器中的 H5 游戏需要读取机器硬件信息(如打印小票、读取设备状态),由 App 提供 HTTP 接口
- 局域网内其它设备(打印机、扫码枪、工位机)调用手机上的 HTTP 接口完成业务动作
- 调试阶段把 App 内部能力以 REST 方式暴露给外部工具
使用流程
- 注册监听:
httpListener(callback) 注册全局事件监听,所有服务状态与请求事件都会回调到这里(持续回调)。
- 开启服务:
startHttp({ port, outTime }, callback) 开启 HTTP 服务。
- 处理请求:收到请求后(
data.status == 'onReceive'),根据 data.uri 分发处理。
- 发送数据:
sendData(data, callback) 把响应数据回传给请求方;不调用则等待超时(默认 15 秒)后返回空数据。
- 关闭服务:
stopHttp(callback) 关闭服务。
用法
import {
httpListener,
startHttp,
stopHttp,
getIpAddress,
sendData
} from '@/uni_modules/zy-httpServer'
注册监听
httpListener((res) => {
if (res.code != 0) {
console.log('错误:' + res.message)
return
}
const data = res.data
if (data.status == 'onStart') {
console.log('服务已开启')
} else if (data.status == 'onStop') {
console.log('服务已关闭')
} else if (data.status == 'onReceive') {
console.log('收到请求:' + data.method + ' ' + data.uri)
dealRequest(data)
}
})
开启 / 关闭服务
// 端口缺省 8080,等待响应超时缺省 15000 毫秒
startHttp({ port: 8080, outTime: 15000 }, (res) => {
if (res.code != 0) {
console.log('开启失败:' + res.message)
}
})
stopHttp((res) => {
if (res.code != 0) {
console.log('关闭失败:' + res.message)
}
})
处理请求并返回数据
function dealRequest(data) {
switch (data.uri) {
case '/getIpAddress':
getIpAddress((res) => {
sendData({ ip: res.data.ip }, () => {})
})
break
case '/hello':
sendData({ msg: 'hello', time: Date.now() }, () => {})
break
default:
sendData({ error: '无效请求' }, () => {})
}
}
获取本机 IP
getIpAddress((res) => {
if (res.code == 0) {
console.log('本机 IP:' + res.data.ip)
}
})
插件方法
| 方法 |
说明 |
回调 |
httpListener(callback) |
注册全局事件监听(持续回调) |
回调结构同上 |
startHttp(options, callback) |
开启 HTTP 服务,options.port 端口、options.outTime 超时毫秒 |
成功 data.status == 'onStart' |
stopHttp(callback) |
关闭 HTTP 服务 |
成功 data.status == 'onStop' |
getIpAddress(callback) |
获取本机局域网 IPv4 地址 |
成功 data.ip 为地址 |
sendData(data, callback) |
向当前等待响应的请求方发送数据 |
成功 data.status == 'sendSuccess' |
回调结果结构
{
code : 0, // 0 表示成功,非 0 为错误码
message : '', // 错误描述,成功时为空串
data : {
status : 'onReceive', // listenerSuccess / onStart / onStop / onReceive / sendSuccess / ip
uri : '/hello', // 请求 URI
method : 'GET', // 请求方法
ip : '', // 本机 IP(status 为 ip 时)
port : 8080, // 监听端口(status 为 onStart 时)
headers : null, // 请求头(UTSJSONObject)
cookie : null, // 请求 Cookie(UTSJSONObject)
params : null, // 查询参数(UTSJSONObject,同名参数为数组)
body : null // 请求体(UTSJSONObject)
}
}
HTTP 响应结构
请求方收到的响应为 application/json:
{
"status": 200,
"headers": { "User-Agent": "..." },
"data": { "msg": "hello" }
}
status:HTTP 状态码(200 成功,500 内部错误)
headers:本次请求的请求头
data:sendData 传入的数据;未调用或超时时为 {}
错误码
| 错误码 |
说明 |
| 9210001 |
参数错误 |
| 9210002 |
已开启服务 |
| 9210003 |
未开启服务 |
| 9210004 |
启动 HTTP 服务失败(端口被占用等) |
| 9210005 |
当前没有等待响应的请求 |
| 9210006 |
获取本机 IP 地址失败 |
| 9210007 |
发送数据失败 |
| 9210008 |
操作失败 |
权限说明
| 权限 |
用途 |
android.permission.INTERNET |
监听端口、收发 HTTP 数据 |
android.permission.ACCESS_WIFI_STATE |
读取 WiFi 状态 |
android.permission.ACCESS_NETWORK_STATE |
读取网络状态、获取本机 IP |
与原插件(leven-uts-http)的差异
本插件基于 leven-uts-http 的 leven_uts_httpd-release.aar 反编译实现,接口与回调语义保持一致,同时做了以下调整:
- 去掉三方依赖:原 aar 依赖
com.alibaba.fastjson 与 org.nanohttpd:nanohttpd,本插件改为纯 Kotlin 实现(HTTP 解析 + org.json),避免多插件共存时的依赖冲突(checkReleaseDuplicateClasses)。
- 去掉试用期限制:原 aar 内含
TestUtils 试用期校验(到期后抛异常阻断使用),本插件不包含任何限制逻辑。
- 去掉广播 + Service 架构:原实现通过
WebService + 全局广播在应用进程与 Service 间传递数据;本插件直接在应用进程内通过回调分发,避免 Android 8+ 后台服务限制与 Android 14 广播导出标志限制。
- 请求体解析修正:原实现把 query string 当作 body 处理;本插件按
Content-Length / Transfer-Encoding: chunked 正确读取请求体,JSON 请求体会展开字段并保留 _raw 原文。
- 并发支持:原实现只支持单个等待中的请求;本插件按队列支持多个并发请求,
sendData 按先进先出投递。
示例页面
pages/http-server/http-server.vue