搜索结果

×

搜索结果将在这里显示。

🍉使用示例(VB.NET)

🧰 MicroServer 渐进式使用手册

第一章:基础 WebAPI(开箱即用)

如果你只需要程序具备响应 Web 请求、返回数据的功能,看这一节就够了。

1. 启动服务与起步

只需初始化 WebAPIServer 并调用 StartServer

Private ReadOnly MyAPI As New WebAPIServer

Sub Main()
    ' 启动服务(默认端口 8090)
    MyAPI.StartServer() 
    ' 注册路由(见下方映射方法)
    MyAPI.AddRoute("/", AddressOf hello, "GET")
    Console.ReadKey()
End Sub

相关方法

' 添加路由白名单,白名单内的路由不经过中间件处理
MyAPI.RouteWhiteList.Add("/hello")
MyAPI.ClearRoutes() ' 清除所有路由
MyAPI.StopServer() ' 停止服务

2. 路由映射的三种姿势

MicroServer 提供了灵活的路由装配方式:

  1. 方法映射:最常用的方式,逻辑清晰,限定请求方法。
    MyAPI.AddRoute("/hello", AddressOf hello, "GET")

    Private Async Function hello(request As HttpListenerRequest, response As HttpListenerResponse) As Task
    Dim name = request.ParseGetQueryString("name") '获取url查询参数
    If name = "" Then
        name = "MicroServer"
    End If
    Await response.WriteAsync(<t>{"code":1,"msg":"Hello <%= name %> WebAPI"}</t>.Value)
    End Function
  2. 匿名函数:适合一行代码搞定的逻辑。
    MyAPI.AddRoute("/status", Function(req, resp) resp.WriteAsync("OK"), "GET")

  3. 多动作路由:不限制方法,在逻辑内判断分发。
    MyAPI.AddRoute("/user", AddressOf userHandle)

    Private Async Function users(request As HttpListenerRequest, response As HttpListenerResponse) As Task
    Select Case request.HttpMethod
        Case "GET"
            '生成一个有效期为1小时的jwt token
            Dim token = MyAPI.JWT.GenerateToken(<t>{"username":"microserver","exp":<%= MyAPI.GetTimeStamp10(60 * 60) %>>}</t>.Value)
            '返回用户信息的请求,并携带token
            Await response.WriteAsync(<t>{"code":1,"msg":"获取用户信息成功","data":{"username":"microserver","age":30},"token":<%= token %>}</t>.Value)
        Case "POST"
            '这里直接解码jwt token获取负载内容即可,内置鉴权会自动验证token合法性,非法token会被中间件拦截,不会执行到这里
            Dim playload = MyAPI.JWT.DecodePayload(request.GetToken)
            '可以进一步判断token的合法性和有效期
    
            '假设body是JSON格式,包含用户信息
            Await response.WriteAsync(<t>{"code":1,"msg":"创建用户成功","data":"<%= playload %>"}</t>.Value)
        Case Else
            response.StatusCode = 405 ' 方法不允许
            Await response.WriteAsync(<t>{"code":0,"msg":"方法不允许"}</t>.Value)
    End Select
    End Function

    内置方法

    '获取请求体字符串内容
    Dim body = Await request.GetStringAsync
    '两种内置时间戳方法
    MyAPI.GetTimeStamp13(60 * 60 * 1000) '获取当前时间戳(13位),并加上1小时的有效期,不传参数获取当前,单位毫秒
    MyAPI.GetTimeStamp10(60 * 60) '获取当前时间戳(10位),并加上1小时的有效期,不传参数获取当前,单位秒
    '如果提交的是POST请求体表单的键值对,可以使用以下方法获取
    Dim name = request.ParsePostQueryString("name")

第二章:武器库扩展(流媒体与长连接)

当你需要处理大文件、实时监控或间断性通知时,可以安装这些“增强零件”。

常用方法

'添加一个路由用于 下载文件,限定GET方法
MyAPI.AddRoute("/download", Function(req, resp) resp.SendFileAsync("E:\3 生活\爸爸喂饭.mp4"), "GET")
'添加一个路由用于 上传文件,限定POST方法,进度回调为可选参数
MyAPI.AddRoute("/upload", Function(req, resp) req.SaveFileAsync("E:\3 生活\上传文件测试\123.data", Sub(cur, total) Console.WriteLine($"进度:{cur / total}%")), "POST")

1. 视频播放与预览

asAttachment 默认True,强制要求下。False不做要求,可用于预览文档,视频观看类型文件

' 适合视频播放器调用
MyAPI.AddRoute("/mp4", Function(req, resp) resp.SendFileAsync("D:\movie.mp4", False), "GET")

2. 实时直播流模式

isLive:=True 是否为直播流(文件或流)。若为True则开启Chunked模式且不缓存,非常适合安防监控转发。

MyAPI.AddRoute("/live", Function(req, resp)
    Dim fs = New FileStream("camera.mp4", FileMode.Open, FileAccess.Read, FileShare.ReadWrite)
    Return resp.SendStreamAsync(fs, "video/mp4", isLive:=True)
End Function, "GET")

3. 长连接与文件上传

' 长连接推送:注意结束时务必调用 resp.Close()
MyAPI.AddRoute("/notify", Function(req, resp) resp.WriteChunkAsync("报警信息"), "GET")

' 上传文件:支持进度回调
MyAPI.AddRoute("/upload", Function(req, resp) req.SaveFileAsync("D:\up.dat", Sub(cur, total) Console.WriteLine($"进度:{cur * 100 / total}%")), "POST")

第三章:安全守卫(JWT 与中间件)

在请求到达业务逻辑之前,用“中间件”将其拦截或放行。

1. 开启拦截验证

只需一行代码,自动校验 Header 中的 Authorization 字段。

'添加简单token验证中间件
MyAPI.AddSimpleTokenVerify("333") '所有路由都需要验证token,参数为token值
' 或 JWT 模式
MyAPI.AddJwtTokenVerify("micoroserver779")'所有路由都需要验证jwt token,参数为签名密钥

内置两种身份鉴权中间件对webapi、websocket、文件上传下载等操作统一鉴权。无需鉴权的路由可添加至白名单MyAPI.RouteWhiteList.Add("/hello")

2. 身份令牌操作

内置时间戳工具,生成的 Token 可直接作为响应返回。

'通用获取token的方法
dim token=request.GetToken

' 生成 1 小时(3600秒)有效的 JWT
Dim exp = MyAPI.GetTimeStamp10(3600)
Dim jwttoken = MyAPI.JWT.GenerateToken(<t>{"user":"admin","exp":<%= exp %>}</t>.Value)

' 在路由中解码 Token 获取负载
Dim payload = MyAPI.JWT.DecodePayload(request.GetToken)

第四章:实时通信(WebSocket)

当需要低延迟、双向数据交换时,启用 WebSocket服务端和客户端。

WebSocket服务端

1. 配置与启用
MyAPI.enableWebSocket = True
MyAPI.WsOnConnectionChanged = AddressOf WsConnectChanged
MyAPI.WsOnMessage = AddressOf OnMessageReceived
2. 状态与消息处理
Private Async Function OnMessageReceived(clientId As String, msg As String, sendReply As Func(Of String, Task)) As Task
    Console.WriteLine($"收到来自 {clientId} 的消息: {msg}")
    ' 示例:回复客户端
    Await sendReply($"我已收到: {msg}")
End Function

Private Sub WsConnectChanged(clientId As String, connected As Boolean)
    If connected Then
        Console.WriteLine($"WS客户端 {clientId} 已连接")
    Else
        Console.WriteLine($"WS客户端 {clientId} 已断开")
    End If
End Sub

相关方法

' 获取当前所有在线的 WebSocket 客户端 ID 列表
MyAPI.WsGetOnlineClients()

WebSocket客户端

1. 引用与实例声明
Imports MicroServer
Module WebSocketTest
    Private wsClient As WebSocketClient ' WebSocket 客户端实例
    ' 后续逻辑...
End Module
2. 初始化与事件订阅
' 初始化客户端,指定服务器地址
wsClient = New WebSocketClient("wss://echo.websocket.org/")

' 订阅核心事件
AddHandler wsClient.OnConnected, AddressOf OnConnected ' 连接成功
AddHandler wsClient.OnMessageReceived, AddressOf OnMessageReceived ' 接收消息
AddHandler wsClient.OnDisconnected, AddressOf OnDisconnected ' 连接断开
AddHandler wsClient.OnError, AddressOf OnError ' 异常触发
3. 核心操作
方法 功能说明
wsClient.StartConnect() 启动客户端,建立与服务器的连接
wsClient.SendMessageAsync(message) 异步发送字符串消息到服务器
wsClient.StopConnect() 主动断开 WebSocket 连接
4. 事件回调示例
' 连接成功
Private Sub OnConnected(sender As Object, e As EventArgs)
    Console.WriteLine("连接成功!")
End Sub

' 接收消息
Private Sub OnMessageReceived(sender As Object, message As String)
    Console.WriteLine($"收到消息: {message}")
End Sub

' 连接断开
Private Sub OnDisconnected(sender As Object, e As EventArgs)
    Console.WriteLine("连接已断开!")
End Sub

' 异常处理
Private Sub OnError(sender As Object, e As WebSocketErrorEventArgs)
    Console.WriteLine($"错误: {e.ErrorCode}, {e.ErrorMessage}")
End Sub