MetaMessage,開啟了API革命!

简介: MetaMessage是AI时代新型结构化数据协议,自描述、自约束、自示例,支持JSONC注释语法(如`// mm: type=email; desc=邮箱`),实现跨语言精准交互、零损耗Schema传递与实时API契约验证,彻底告别过时文档与解析歧义。(239字)

截屏2026-05-26 00.30.21.png

傳統api調用存在很多問題。

  1. 很多應用,api是沒有文檔的,調用者根本無法得知api的請求參數和返回數據是什麼樣的,規範是什麼。
  2. 發佈一個api,可能還得發佈文檔,比如Swagger。大多數開發者很難寫好文檔,文檔質量參差不齊。
  3. 文檔發佈地址就是一個問題。即使有文檔,也很難找。還有一些文檔受限於網絡、權限等,看不了。
  4. 文檔可能和api脫節,更新不及時。甚至造成各種歧義。
  5. 文檔很難管理,丟失、遺忘等問題很常見。
  6. 開發者、調用者之間協作困難,甚至相互誤解。
    ...

問題太多了,這只是冰山一角。而MetaMessage的出現,可能真正改變了這種局面。

MetaMessage,自描述、自規範、自示例。比如,輸出為一個文本格式jsonc:

{
  // mm: type=datetime; desc=創建時間
  "create_time": "2026-01-01 00:00:00",
}

看起來很簡單,type表示了數據格式,各種語言實現一致,不會出現某個語言解釋為字符串的問題。desc可以描述字段含義、使用方法等。
當然還有更多標籤,這些標籤共同描述了一種精確、完整的數據。

開發者可以直接從各語言的數據對象直接生成mm,也可以通過比如jsonc字符串生成mm。代表的數據是完全一致的。
說到這裡,對於多語言間的數據對比,實際很困難,甚至說還沒有一個好的方法真正能做到,對於測試來說就是一個很大的問題。
而都轉成mm,對比文本非常方便。

還有一些其他的優點,比如可以生成緊湊的二進制,可以生成更多文本格式等等。未來,一個mm可以生成jsonc、toml、yaml等格式,作為配置文件的轉換非常方便。

遠了。

我們在調用一個api的時候,能不能直接獲取它的請求方法?我想到一個方法,我們可以利用resful的options方法。options方法設計之初就是資源探測,但是幾十年來,大家僅僅是用來表示cors,描述跨域問題。太浪費了。而且瀏覽器默認會在post等請求前,調用下options方法,我們是沒辦法取消的,有點可笑了。我們可以把請求參數方法放在options返回的body中,這樣調用方不就能獲得實時的、準確的請求方法了嗎?

OPTIONS /api/v1/users/1:

// mm: example
{

        // mm: nullable; desc="用戶名稱"
        "name": "",

        // mm: type=email; nullable; desc="電子郵箱"
        "email": "",

        // mm: type=u8; nullable; desc="年齡"
        "age": 0,

        // mm: nullable; desc="是否激活"
        "is_active": false,
}

這時一個修改用戶的api,當我們看到這個結果,我們就能知道name可以為null,age必須是uint8.當然整體上還能得出這是個example示例數據。

我們請求的時候,只要完全符合,那麼就是安全合法的。

實踐

我們來做一個golang gin的中間件,實現這樣的功能:

  1. 對於post、put、patch方法,把請求參數自動包裝、暴露到options
  2. 自動以mm對請求進行編碼
  3. 對返回結果自動解嗎

為了方便使用和演示,我們還可以做個客戶端:

  1. 請求的時候,自動探測schema,也就是請求options
  2. 自動驗證請求合法性

當然服務端和客戶端都會自動驗證。

server:

...

type CreateUserRequest struct {
    Name  string `mm:"desc=用戶名稱; min=1; max=50"`
    Email string `mm:"type=email; desc=電子郵箱"`
    Age   uint8  `mm:"desc=年齡; min=0; max=150"`
}

mmgin.POST("/users", createUser)

func createUser(c *gin.Context, req *CreateUserRequest) {
    newUser := User{
        ID:       int64(len(users) + 1),
        Name:     req.Name,
        Email:    req.Email,
        Age:      req.Age,
        IsActive: true,
    }
    users = append(users, newUser)

    mmgin.RespondWithStatus(c, http.StatusCreated, APIResponse{
        Code:    0,
        Message: "user created",
        Data:    &newUser,
    }, "")
}
...

client:

...

type CreateUserRequest2 struct {
    Name  string `mm:"desc=用戶名稱; min=1; max=50"`
    Email string `mm:"type=email; desc=電子郵箱"`
    Age   uint8  `mm:"desc=年齡; min=0; max=150"`
}

createReq := &CreateUserRequest2{
    Name:  "David",
    Email: "david@example.com",
    Age:   28,
}
resp3, err := client.POST[CreateUserRequest2, APIResponse]("/api/v1/users", createReq)
if err != nil {
    fmt.Printf("  [Error] %v\n", err)
    return
}
fmt.Printf("  [OK] Message: %s\n", resp3.Message)
fmt.Printf("     New User: %+v\n", resp3.Data)
...

以上可以看到,使用非常簡單,甚至無感。
完整示例可參見"metamessage/mm-gin"項目

可測試的結果是,只要請求數據不合法,在options階段就會失敗。

注意這是強一致的,是實時驗證的。

未來

api不用寫文檔,代碼就是文檔。

每個api接口,自動生成一個schema

陌生的api,沒關係,自動獲取請求參數;api更新,沒關係,自動獲得更新後的請求參數。

特別是眾多瀏覽器,怎麼也不會想到options還能這麼用,如果內置這種用法,對各種api更是幫助巨大。

MetaMessage作為基礎協議,會在各種場景有更多重要應用。

目录
相关文章
|
5月前
|
JSON JavaScript 前端开发
在TypeScript和JavaScript如何使用MetaMessage?
MetaMessage 是一种跨语言数据交换协议,支持 TypeScript/JavaScript(通过装饰器自动类型转换)、JSONC 文本与紧凑二进制 wire 格式,兼顾可读性、精度(如 bigint 表示 int64)与性能,旨在替代 JSON、Protobuf 等传统序列化方案。
285 125
|
5月前
|
编解码 自然语言处理 Java
MetaMessage 的簡單使用
MetaMessage(mm)是一款轻量级CLI工具,支持JSONC与二进制MetaMessage格式的编/解码,以及多语言(Go/Java/TS/Python等)结构体代码自动生成,高效便捷,开箱即用。
144 0
|
传感器 安全 中间件
深入浅出:SOME/IP协议中的服务发现机制解析
深入浅出:SOME/IP协议中的服务发现机制解析
1435 1
|
2月前
|
存储 人工智能 JSON
「它凭什么这么说」—— Semantica 让 AI 的每个结论都能翻回出处
Semantica 是面向 AI 系统的开源知识图谱与决策溯源平台,专注解决“AI 决策不可追溯”痛点。它不存向量,而构建可审计的上下文图,支持实体消歧、确定性推理、W3C 标准溯源与因果路径追踪,让每条结论均可查来源、验逻辑、担责任。
|
4月前
|
机器学习/深度学习 算法 数据挖掘
数据挖掘是什么?数据分析、数据挖掘、数据统计三者的区别是什么
本文用大白话厘清数据分析、数据挖掘、数据统计的本质区别:数据分析解决具体业务问题,重在“解释过去”;数据挖掘从海量数据中发现未知规律,重在“预测未来”;数据统计通过样本科学推断总体,重在“验证因果”。三者路径不同、目标各异,明确差异才能准确定位、选对方法、少走弯路。
|
8月前
|
BI
春节复工后,2026年1688店铺想突围,这份操作运营指南请收好!
春节后1688运营必做清单:分三阶段——急救重启(发货清零、视觉焕新)、赛道布局(定位选品、数据诊断)、流量抢跑(搜索优化、老客召回)。聚焦金冠培育、新品破零、层级提升,踩准平台节奏,抢占开年红利!
|
3月前
|
缓存 Rust 安全
Nolang 硬核技术白皮书:全方位内核级超越 Rust(纯语言机制对比)
Nolang 是新一代无GC内存安全语言,首创“延迟所有权”模型:赋值直觉、零生命周期负担、函数末尾批量内存回收,性能与安全全面超越Rust。当前生态尚小,但内核、架构与开发体验已实现碾压式领先。(239字)
319 3
|
4月前
|
人工智能 JSON 监控
阿里云开发者实践:用结构化数据驱动大模型可见度监控系统设计
黄小宇开展个人GEO实验,设计轻量级监控系统,通过结构化JSON(含score、混淆标识、引用源等)量化大模型对“黄小宇”实体的识别效果,实现“发布→监测→分析→迭代”闭环,助力AI时代个人名片可见度提升。(239字)
|
6月前
|
缓存 安全 网络安全
远程办公网络安全中,IP查询工具如何保障数据安全?适用场景与落地指南
本文介绍远程办公中IP查询的合规风控实践:服务端统一调用、仅传IP、三档处置(放行/加验/阻断)、全链路可审计。覆盖异地登录、代理伪装、恶意情报三大场景的IP查询工具,提供策略模板、缓存降级与PoC验收标准,满足四条硬门槛即可安全落地。
|
4月前
|
SQL 关系型数据库 MySQL
SQL代码审查指南:命名规范+10大反模式+四维检查清单,一篇全搞定
数据库小学妹带你攻克SQL规范难题!从命名、格式到10大反模式(如SELECT*、隐式转换、ORDER BY RAND等),结合真实踩坑案例,详解可读、可维护、高性能的SQL写法,并提供SQL Review四维审查清单与团队落地方法,助你写出工业级质量SQL。