更新记录

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 方式暴露给外部工具

使用流程

  1. 注册监听:httpListener(callback) 注册全局事件监听,所有服务状态与请求事件都会回调到这里(持续回调)。
  2. 开启服务:startHttp({ port, outTime }, callback) 开启 HTTP 服务。
  3. 处理请求:收到请求后(data.status == 'onReceive'),根据 data.uri 分发处理。
  4. 发送数据:sendData(data, callback) 把响应数据回传给请求方;不调用则等待超时(默认 15 秒)后返回空数据。
  5. 关闭服务: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 反编译实现,接口与回调语义保持一致,同时做了以下调整:

  1. 去掉三方依赖:原 aar 依赖 com.alibaba.fastjson 与 org.nanohttpd:nanohttpd,本插件改为纯 Kotlin 实现(HTTP 解析 + org.json),避免多插件共存时的依赖冲突(checkReleaseDuplicateClasses)。
  2. 去掉试用期限制:原 aar 内含 TestUtils 试用期校验(到期后抛异常阻断使用),本插件不包含任何限制逻辑。
  3. 去掉广播 + Service 架构:原实现通过 WebService + 全局广播在应用进程与 Service 间传递数据;本插件直接在应用进程内通过回调分发,避免 Android 8+ 后台服务限制与 Android 14 广播导出标志限制。
  4. 请求体解析修正:原实现把 query string 当作 body 处理;本插件按 Content-Length / Transfer-Encoding: chunked 正确读取请求体,JSON 请求体会展开字段并保留 _raw 原文。
  5. 并发支持:原实现只支持单个等待中的请求;本插件按队列支持多个并发请求,sendData 按先进先出投递。

示例页面

pages/http-server/http-server.vue

隐私、权限声明

1. 本插件需要申请的系统权限列表:

android.permission.INTERNET android.permission.ACCESS_WIFI_STATE android.permission.ACCESS_NETWORK_STATE

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件仅在本机开启HTTP监听端口,接收到的请求数据不会上传至任何服务器

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

无

暂无用户评论。