Skip to content

Releases: leiddev/webview-httplib-demo

v0.2.1

Choose a tag to compare

@github-actions github-actions released this 30 Sep 01:20

v0.2.1 — 错误对话框说人话了

一个小补丁:修掉 Windows 上错误对话框里的中文乱码。没有接口变化,也没有新依赖。

本次改动

  • fatal() 弹出的对话框终于看得懂了。 原来那句是
    MessageBoxW(nullptr, std::wstring(msg.begin(), msg.end()).c_str(), ...),
    它是按字节往 wchar_t 里塞:一个汉字(UTF-8 3 字节)会变成 3 个乱码字符;
    又因为 MSVC 的 char 是带符号的,字节 0xE7 还会符号扩展成 0xFFE7。
    结果「端口 18087 已被占用」在对话框里显示成
    ￧ᆱᆵ←マᆪ 18087 ←ᄋᄇ│ᄁᆱ←ヘᅠ￧ヤᄄ —— 数字还在,中文一个不剩。
    现在用 to_wstring_utf8()(MultiByteToWideChar(CP_UTF8, ...))真正转一次码。
  • 为什么值得单独发一版:三条 fatal() 消息全是中文,其中
    「webview 初始化/运行失败: … 请确认已安装 WebView2 运行时」正好是第一次用的人最容易
    撞上的那条;而项目默认 GUI 子系统(不弹黑框)、没有控制台,这个对话框是唯一的报错出口 ——
    糊在那里等于什么都没说。/W3 下编译器一句警告都没有,所以这个坑一直活着。
  • OutputDebugStringA → OutputDebugStringW:同一个病根,日志在 VS 输出窗口 /
    DebugView 里同样是糊的。
  • to_wstring_utf8() 的 flags 传 0,不传 MB_ERR_INVALID_CHARS:非法字节换成
    U+FFFD,而不是让报错本身失败 —— 和 json_text() 用 error_handler_t::replace 一个态度。
  • README 补坑 12:/utf-8 的连带后果(Win32 的 *A 接口在 /utf-8 下一个都用不了,
    MessageBoxA 不是退路),以及「把对话框正文读回来核对」的验证办法。

升级提醒

没有。接口、返回值和依赖都没动,这次只改了 Windows 上的错误提示。

Linux 侧零变化:改动整个在 #ifdef _WIN32 里,CI 报的 Linux 产物大小 961,488 字节,
和 v0.2.0 那个 asset 一个字节都不差。

下载

文件 平台 运行前提
webview-demo-v0.2.1-windows-x64.exe Windows 10/11 x64 WebView2 运行时(Win11 及较新的 Win10 一般自带)
webview-demo-v0.2.1-linux-x64 Linux x64 WebKitGTK 4.1(libwebkit2gtk-4.1-0)+ 可用的显示环境

两个二进制都是推 tag 之后由 CI 现场从该 commit 编出来的,不是手工上传的。

完整变更

v0.2.0...v0.2.1

v0.2.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 09:40

v0.2.0 — 请了一个 JSON 库来干活

第二个带手写发布说明的版本,也是第一个换了 JSON 实现的版本:
src/main.cpp 里 53 行自己写的 JSON 工具(转义 / 解析 / 数字格式化)全部删掉,
六个接口和三个 webview::bind 回调改成直接构造 JSON 对象。

本次改动

  • JSON 交给 nlohmann/json:删掉 json_escape、first_json_string、
    format_number,只留一个 json_text() 当唯一出口。/api/assets 那个
    「手写逗号分隔」的循环换成 push_back —— 这类代码最容易在「第一个元素前
    不加逗号」上出错,现在没得错了。
  • 两个可见的行为变化(这次发 minor 而不是 patch 就是因为它俩):
    • POST /api/add 返回 {"a":12.0,"b":30.0,"sum":42.0},不再是
      {"a":12,"b":30,"sum":42}。这三个值本来就是 double,JSON 库只是没替我们
      「猜」成整数;任何 JSON 解析器读到的数值都一样。
    • GET /api/info 多一个 "nlohmann/json":"3.12.0" 字段。
  • 顺手修掉一个潜在 500:dump() 默认遇到非法 UTF-8 会抛 type_error.316,
    也就是 GET /api/echo?q=%FF%FE 这种一个 URL 就能把接口打挂。现在统一带
    error_handler_t::replace,坏字节换成 U+FFFD,返回的仍然是合法 JSON
    (手写转义那会儿是直接吐非法字节,只是从来没校验过)。
  • 页面标题补上第四个库:<title>、顶部徽章、页脚都加了 nlohmann/json,
    原生窗口标题同步。
  • 依赖接入方式:用 include.zip + 自建 INTERFACE 目标,而不是官方文档推荐的
    json.tar.xz —— 后者带一份它自己的 CMakeLists.txt,会把第三方的构建脚本
    一起拉进来。配了 URL_HASH,上游换了 asset 会当场报错而不是悄悄编过。
  • CI 的 Linux 冒烟测试升级成真断言:每个接口的返回必须能被 python3 的
    json.load 吃掉、关键字段对得上,另加「缺参数必须 400」「坏 UTF-8 不能 500」
    「首页内容必须是这一版」三条。以前那步只是 curl 出来看一眼,等于没测。
  • README:新增「JSON 处理」小节(前后对比 + 代价)和坑 11(ordered_json
    的键顺序、error_handler_t、42.0);「已验证的环境」按新实测重新校准。

升级提醒

如果你在外部脚本里 POST /api/add,把期望值从 "sum":42 改成 "sum":42.0 即可
(jq、JSON.parse、Python 的 json 都当同一个数读)。

下载

文件 平台 运行前提
webview-demo-v0.2.0-windows-x64.exe Windows 10/11 x64 WebView2 运行时(Win11 及较新的 Win10 一般自带)
webview-demo-v0.2.0-linux-x64 Linux x64 WebKitGTK 4.1(libwebkit2gtk-4.1-0)+ 可用的显示环境

两个二进制都是推 tag 之后由 CI 现场从该 commit 编出来的,不是手工上传的。

完整变更

v0.1.1...v0.2.0

v0.1.1

Choose a tag to compare

@github-actions github-actions released this 29 Sep 07:04

v0.1.1 — 让发布流程自己说明白

第一个带手写发布说明的版本:说明不再由 GitHub 自动生成,而是从本文件读取
(约定见 README 的「下载预编译版本」一节:release-notes/<tag>.md 优先,其次
根目录 RELEASE_NOTES.md,都没有才回退到 --generate-notes)。

本次改动

  • CI 不再报 node20 弃用告警:actions/upload-artifact 升到 v6、
    actions/download-artifact 升到 v7,都换成了 node24 运行时(输入参数没变,
    name / path 等照旧)。
  • 发布说明支持手写:publish job 增加了 actions/checkout,按
    release-notes/<tag>.md → RELEASE_NOTES.md → 自动生成的顺序取正文。
  • README 新增「下载预编译版本」一节:写清两个二进制各自需要什么才能跑起来
    (Windows 要 WebView2 运行时,Linux 要 WebKitGTK 4.1 + 显示环境),
    以及 tag 推上去之后 CI 到底做了什么。

下载

文件 平台 运行前提
webview-demo-v0.1.1-windows-x64.exe Windows 10/11 x64 WebView2 运行时(Win11 及较新的 Win10 一般自带)
webview-demo-v0.1.1-linux-x64 Linux x64 WebKitGTK 4.1(libwebkit2gtk-4.1-0)+ 可用的显示环境

两个二进制都是推 tag 之后由 CI 现场从该 commit 编出来的,不是手工上传的。

完整变更

v0.1.0...v0.1.1

v0.1.0

Choose a tag to compare

@github-actions github-actions released this 29 Sep 06:49

v0.1.0 — 第一个版本:三个库串成一条完整链路

第一个可以下载的版本。目标是最小但完整:用最少的依赖证明
cpp-httplib(HTTP 服务)+ webview(原生窗口)+ cpp-embedlib(前端打包进可执行文件)
这三件事能真的串起来,而不是各写各的 demo。

它是什么

跑起来是一个原生窗口,界面是本地 HTML 页面,但它不是从磁盘读的:
HTML / CSS / JS 全部被 cpp-embedlib 编译进了可执行文件,由后台的 cpp-httplib 服务器
从内存里发出来,窗口本身由 webview 创建(Windows 上是 Edge WebView2,
Linux 上是 GTK + WebKitGTK)。webview 用的是 0.12.0 的 C++ API,
窗口对象放栈上、靠 RAII 析构销毁。

里面有什么

  • 6 个 HTTP 接口(全部返回 application/json; charset=utf-8):
    GET /api/hello(C++ 后端的问候)、GET /api/time(本地时间 + 运行时长)、
    GET /api/echo?q=…(回显与长度)、POST /api/add(表单 a + b 求和,缺参数返回 400)、
    GET /api/assets(列出被内嵌的前端资源:路径 / MIME / 字节数)、
    GET /api/info(三个库的版本 + 平台 + pid + uptime)。
    首页 / 由 cpp-embedlib 的 httplib::mount() 兜底提供。
  • 3 个 JS → C++ 绑定(走 webview::bind,完全不经过 HTTP):
    cppNativeEcho(把文本交给 C++ 处理再回传)、cppNativeHandle(拿到原生窗口句柄,
    Windows 是 HWND、Linux 是 GtkWidget *)、cppCloseWindow(关闭窗口、结束消息循环)。
    这些回调跑在 UI 线程上,HTTP 服务跑在后台线程。
  • 端口:默认在 127.0.0.1 上自动挑一个空闲端口,也可以用 --port 18080 指定;
    端口被占用时弹对话框说明原因,而不是静默失败。
  • 依赖全部自动拉取:cpp-httplib v0.38.0、webview 0.12.0、cpp-embedlib(main),
    三个都走 FetchContent,不用手动 clone。
  • 构建:CMake ≥ 3.20 + 预设(Windows:x64 / x64-console;Linux:linux / linux-debug)。
    Windows 默认不弹控制台黑框,调试时用 x64-console。
  • CI:windows-latest + ubuntu-22.04 双平台配置与编译,Linux 侧另跑一遍 HTTP 冒烟测试。

下载

文件 平台 运行前提
webview-demo-v0.1.0-windows-x64.exe Windows 10/11 x64 WebView2 运行时(Win11 及较新的 Win10 一般自带)
webview-demo-v0.1.0-linux-x64 Linux x64 WebKitGTK 4.1(libwebkit2gtk-4.1-0)+ 可用的显示环境

两个二进制都是推 tag 之后由 CI 现场从该 commit 编出来的,不是手工上传的。

已知限制

  • macOS 未验证:webview 在 macOS 上走 WKWebView,代码里也留了分支,
    但构建脚本和 CI 都没有覆盖它,所以不敢说能跑。
  • 没有 install / 打包步骤:产物就是单个可执行文件(前端已经在里面了),
    但 Windows 侧依赖系统的 WebView2 运行时,Linux 侧依赖系统的 WebKitGTK ——
    这两样都要求运行环境里已经装好。
  • JSON 还是手写转义拼出来的;把这件事交给一个成熟的 JSON 库是后面版本的事。

完整变更

https://github.com/leiddev/webview-httplib-demo/commits/v0.1.0

(v0.1.0 是第一个 tag,没有可比较的上一个版本,所以给的是到这个 tag 为止的全部提交。)

这段说明是事后补写的:v0.1.0 发布时还没有「手写发布说明」的约定
(release-notes/<tag>.md 是 v0.1.1 才加的),正文当时只有一行自动生成的 changelog 链接。