YStudio Y++

HTTP服务端类

Y++ / YStudio 开发文档 · 一点滴

类对象支持库。路径:支持库 → 扩展类库 → HTTP服务端类。

类型名写「HTTP服务端类」。声明时自动创建。

本机 HTTP/1.1 监听;可选 HTTPS(Windows Schannel)。用于 Webhook、本机 API、简易静态应答。与 HTTP类(客户端)分开。

在 IDE 里开通 HTTP服务端类 后才能编译。编进用户程序之后,运行时不再检查授权。

快速开始(明文)

HTTP服务端类 srv

函数 处理Ping(整数 请求ID, 文本 请求方法, 文本 路径, 文本 查询串,
            文本 请求头, 文本 正文, 文本 IP, 整数 端口) {
    srv.应答(请求ID, "pong")
}

函数 主窗口.创建完毕() {
    srv.路由("GET", "/ping", &处理Ping)
    srv.挂载("/static", "www")   // GET /static/a.txt → www\a.txt
    srv.置保持连接(真)           // 默认即真
    如果 (!srv.启动(8080, "127.0.0.1")) {
        输出(srv.取错误())
    }
}

浏览器或其它进程的 HTTP类 访问 http://127.0.0.1:8080/ping 应得到 pong。

同进程用 HTTP类 回环时请 异步(真),再用定时器轮询 是否完成()——服务端回调也在 UI 线程,同步 提交 会堵消息泵。

请求处理顺序

  1. 路由:路由(请求方法, 路径, &回调),路径精确匹配;方法空 / * / ANY = 不限
  2. 静态挂载:挂载(URL前缀, 目录),仅 GET/HEAD;防 .. 穿越;目录 URL 尝试 index.html
  3. 请求到达:默认回调
  4. 皆未命中 → 404

HTTPS(证书)

与 TCP类 / WebSocket类 相同,支持:

方式 方法 说明
PFX/P12 置TLS证书(证书文件, [密码]) 参数为 PFX/P12 文件路径(不是证书显示名)
PEM 置PEM证书(证书文件, 私钥文件) 两个 文件路径:证书链 + 未加密私钥
ACME 申请证书(域名, [邮箱], [保存目录]) Let’s Encrypt HTTP-01;写入目录后自动 置PEM证书
场景 做法
本机联调 PowerShell 自签 PFX,或 mkcert
已有 PEM 直接 置PEM证书
公网域名 申请证书(须 公网 80→本机),或外部 Certbot 后再 置PEM证书

路径怎么填(不必用「合并路径」)

参数填的是磁盘上的文件路径,不是 Windows 证书存储里的「证书名称」。

  • 相对路径:相对进程当前工作目录(调试时常为 exe 所在目录)。例:"server.pfx"、"certs\fullchain.pem"。
  • 绝对路径:直接写完整路径。例:"D:\\ssl\\fullchain.pem"。
  • 合并路径:可选便利写法,用于把「目录 + 文件名」拼成一条路径;不是必须。证书已在固定位置时,直接写路径字符串即可。

加载成功后可用 取证书路径() / 取私钥路径() 回读刚才传入的路径(PFX 时私钥路径为空)。

本机自签 PFX:

$c = New-SelfSignedCertificate -DnsName "localhost","127.0.0.1" -CertStoreLocation Cert:\CurrentUser\My
$pwd = ConvertTo-SecureString -String "ypl" -Force -AsPlainText
Export-PfxCertificate -Cert $c -FilePath server.pfx -Password $pwd
srv.置TLS(真)
如果 (!srv.置TLS证书("server.pfx", "ypl")) {   // 相对路径;也可写绝对路径
    输出(srv.取错误())
    返回()
}
srv.启动(8443, "127.0.0.1")

PEM(两文件都是路径;私钥勿加密):

srv.置TLS(真)
srv.置PEM证书("fullchain.pem", "privkey.pem")
// 可选:srv.置PEM证书(合并路径(取当前目录(), "fullchain.pem"), 合并路径(取当前目录(), "privkey.pem"))
srv.启动(443, "0.0.0.0")

申请证书(ACME HTTP-01)

阻塞调用(可能数十秒),不要塞在短 UI 回调里空等太久。流程:

  1. 先 启动(80, "0.0.0.0")(明文),保证公网能访问 /.well-known/acme-challenge/...
  2. 申请证书("example.com", "you@example.com", "certs") → 写出 certs\fullchain.pem / privkey.pem 并自动加载(第三参是保存目录路径,相对或绝对均可)
  3. 停止() 后 置TLS(真),再 启动(443,...)

沙箱(防刷正式额度):进程环境变量 YPL_ACME_STAGING=1。

定时续期示例(与当前时间比天数):如果 (取时间差(取当前时间(), srv.取到期时间(), 4) < 30) { srv.申请证书(...) }

后台处理与线程池

默认:请求到达 / 路由 在 UI 线程(可改控件;同进程回环请 HTTP类.异步(真))。

高吞吐 API / Webhook:

srv.置后台处理(真)      // 回调进工作线程池;勿直接改控件
srv.置工作线程数(16)    // 连接处理 + 后台回调线程数,默认 8
srv.置最大并发(64)      // 处理中请求上限;0=不限
srv.启动(8080, "0.0.0.0")

连接不再「一连接一线程」,而是固定线程池 + 有界队列;队列满时拒绝新连接。静态目录 / ACME 仍不经业务回调。

要点

项 说明
回调线程 默认 UI;置后台处理(真) 后为工作线程池
应答 回调内 应答 等;未应答 → 500
Keep-Alive 默认开
静态目录 挂载 不经 UI
TLS 置TLS + 证书方法须在 启动前(申请证书时挑战走明文 80)
绑定 本机联调用 127.0.0.1

常用方法

  • 生命周期:启动 / 停止 / 是否在监听 / 取错误 / 重置
  • 路由/静态:路由 / 清除路由 / 挂载 / 清除挂载
  • Keep-Alive:置保持连接 / 取保持连接
  • 并发:置后台处理 / 取后台处理 / 置工作线程数 / 取工作线程数 / 置最大并发
  • TLS:置TLS / 取TLS / 置TLS证书 / 置PEM证书 / 申请证书 / 取到期时间 / 取证书路径 / 取私钥路径
  • 限制:置最大正文 / 置读超时
  • 读请求 / 写响应:同前

非目标(当前)

HTTP/2、chunked、路径参数路由、DNS-01 / 通配符、后台自动续期线程、加密私钥 PEM、双向 mTLS、IOCP 级高并发(以后可另旁路类)、WebSocket 升级(用 WebSocket类)。

收费位:supportlib.httpserver(仅开发期验票)。