拓冰建站拓冰建站
首页 / 资讯中心 / 正文

x402 Go SDK v2.7.0:Bazaar 发现扩展支持动态路由模式与 EnrichExtensions 全面启用

x402 Go SDK v2.7.0Bazaar 发现扩展支持动态路由模式与 EnrichExtensions 全面启用【免费下载链接】x402A payments protocol for the internet. Built on HTTP.项目地址: https://gitcode.com/GitHub_Trending/x4/x402x402 Go SDK 在 v2.7.02026-03-23 发布中让 Bazaar 发现扩展Bazaar discovery extension首次支持动态路由模式EnrichDeclaration会把[param]风格的路由段翻译为:param风格的routeTemplate并从每个真实请求中抽取具体的路径参数填入pathParams与此同时此前在所有 Go 版本中被注释禁用的EnrichExtensions调用正式启用意味着所有声明了扩展的既有路由都会在请求时被动态增强。读完本文你可以理解这一版本的完整变更清单、动态路由增强的源码级实现机制、RouteTemplate新字段的读取方式以及如何通过仓库内现成的测试用例验证这些行为。v2.7.0 变更清单官方原文变更说明见 go/.changes/v2.7.0.md同步收录于 go/CHANGELOG.md。该版本仅有一条Changed记录原文为Changed Bazaar discovery extension to support dynamic route patterns. EnrichDeclaration now translates [param] route segments to :param-style routeTemplate and populates pathParams with concrete values from each request. The EnrichExtensions call in go/http/server.go, previously disabled (commented out) in all prior Go releases, is now active: ALL existing Go routes that declare extensions will have their extensions enriched at request time. Added RouteTemplate field to DiscoveryExtension so callers can read it without a type assertion.拆解为三点Bazaar 发现扩展支持动态路由模式EnrichDeclaration将[param]路由段翻译为:param风格的routeTemplate并用每次请求中的具体值填充pathParamsEnrichExtensions调用启用go/http/server.go 中此前被注释掉的调用恢复生效所有声明了扩展的 Go 路由都会在请求时执行扩展增强DiscoveryExtension新增RouteTemplate字段调用方无需再做类型断言即可读取路由模板。背景Bazaar 发现扩展与声明-增强两段式Bazaar 是 x402 的发现类扩展让服务器向 402 Payment Required 响应体中声明我的端点该如何被调用——包括期望的输入参数/body、输入 JSON Schema 和输出示例。Go SDK 中声明扩展的入口是DeclareDiscoveryExtension位于 go/extensions/bazaar/resource_service.goextension, err : bazaar.DeclareDiscoveryExtension( bazaar.MethodGET, // HTTP 方法查询类或 body 类 map[string]interface{}{query: example}, // 输入示例query 或 body bazaar.JSONSchema{ // 输入 JSON Schema properties: map[string]interface{}{ query: map[string]interface{}{type: string}, }, required: []string{query}, }, , // bodyTypePOST/PUT/PATCH 时生效默认 json nil, // 可选输出配置 OutputConfig )该方法通过可选参数DeclareDiscoveryExtensionOpts支持PathParamsSchema用于声明路径参数的 schema。注意 resource_service.go 中的一段关键注释它揭示了两段式设计意图// pathParams and method are not declared here at schema build time — // the server extensions EnrichDeclaration adds them to both info and schema // atomically at request time, keeping data and schema consistent.也就是说声明时构建的 schema 刻意不写死method和pathParams而是留到请求到来时由服务端扩展server extension的EnrichDeclaration原子性地补进info与schema保证数据与校验规则始终一致。v2.7.0 正是把这条请求时增强链路完整跑通的一版。动态路由从 routePattern 到 routeTemplate 与 pathParams三种输入格式一种输出格式增强逻辑的核心实现是 go/extensions/bazaar/server.go 中bazaarResourceServerExtension的EnrichDeclaration方法。它从HTTPRequestContext读取RoutePattern与实际请求路径支持三种路由参数写法输出统一归一为:param风格输入路由模式routeTemplate 输出说明/users/[userId]Next.js 方括号风格/users/:userId方括号段翻译为冒号段/users/:userIdExpress 冒号风格/users/:userId原样保留/weather/*通配符/weather/:var1*段自动转成:var1、:var2…测试 go/extensions/bazaar/bazaar_test.go 中的TestBazaarDynamicRoutes对上述每种情况都有断言例如httpContext : x402http.HTTPRequestContext{ Method: GET, Path: /users/42/posts/7, RoutePattern: /users/[userId]/posts/[postId], Adapter: mockHTTPAdapterForBazaar{path: /users/42/posts/7}, } enriched : bazaar.BazaarResourceServerExtension.EnrichDeclaration(extension, httpContext) assert.Equal(t, /users/:userId/posts/:postId, enrichedExt.RouteTemplate) assert.Equal(t, 42, queryInput.PathParams[userId]) assert.Equal(t, 7, queryInput.PathParams[postId])静态路由不含参数段则保持RouteTemplate为空、不做任何动态处理/weather/*与/api/*/*/posts/*等多通配符场景分别被归一为/weather/:var1与/api/:var1/:var2/posts/:var3。参数提取的实现细节EnrichDeclaration内部按以下顺序工作通配符归一go/extensions/bazaar/server.go 的normalizeWildcardPattern把*段按出现顺序改写为:var1、:var2……翻译与取值一次完成extractDynamicRouteInfogo/extensions/bazaar/server.go先判断模式中是否含[param]/:param若两者混合出现先把方括号统一替换为冒号再调用extractPathParams用编译好的捕获正则从具体 URL 中提取取值。两种参数风格分别由bracketParamRegex \[([^\]])\]和共享的ColonParamRegex :([a-zA-Z_][a-zA-Z0-9_]*)匹配后者定义在 go/extensions/types/types.go与 HTTP 层共用同一正则以避免两处漂移。正则缓存编译后的捕获正则与参数名列表按路由模式缓存在sync.Map中patternCache见 go/extensions/bazaar/server.go避免每个请求重复编译。写回 info 与 schema取到的具体值被提升为map[string]interface{}写入QueryInput.PathParams/BodyInput.PathParams同时确保 schema 的input.properties中补上pathParams: {type: object}——否则声明阶段设置的additionalProperties: false会把它拒之门外go/extensions/bazaar/server.go。方法收窄QueryInput.Method/BodyInput.Method被覆盖为当前请求的真实方法并在 schema 的required中补上method。两个边界情况值得注意非 HTTP 传输上下文类型断言失败时原样返回声明MCP 类扩展Info.Input为McpInput直接透传不做方法收窄和动态路由提取——MCP 工具不需要这些概念。EnrichExtensions 调用链正式启用v2.7.0 最容易被开发者忽略、但影响面最大的变更是第 2 点EnrichExtensions从死代码变成每次请求都会执行的路径。在 go/http/server.go 的ProcessHTTPRequest中先根据请求路径与方法匹配到路由配置并把路由模式写入上下文routeConfig, routePattern : s.getRouteConfig(reqCtx.Path, reqCtx.Method) ... reqCtx.RoutePattern routePattern // 例如 GET /api/weather随后在构建 402 响应之前extensions : routeConfig.Extensions if len(extensions) 0 { extensions s.EnrichExtensions(extensions, reqCtx) }被增强的扩展随CreatePaymentRequiredResponse一并写入 402 Payment Required 响应的extensions字段见 go/server.go。底层的EnrichExtensionsgo/server.go遍历路由声明的扩展键对每个已注册的扩展调用其EnrichDeclaration(declaration, transportContext)未注册的扩展原样透传接口定义在 go/types/extensions.go。这意味着升级到 v2.7.0 后所有既有 Go 路由无论是否含动态路由段上声明的扩展都会在请求时被增强——静态路由会获得方法收窄动态路由会额外获得routeTemplate与pathParams。为了确认这次激活不会破坏其他扩展仓库提供了专门的回归测试 go/http/server_extensions_test.go其中TestProcessHTTPRequestWithExtensions明确注释自己是针对 EnrichExtensions 激活的回归测试此前该调用处于禁用状态并分别验证了 402 响应路径不回归、paymentidentifier扩展其EnrichDeclaration为 no-op与eip2612gassponsor扩展的声明能原样通过增强环节。RouteTemplate 新字段免类型断言读取DiscoveryExtension结构体新增了RouteTemplate字段定义见 go/extensions/types/types.go// DiscoveryExtension is a union type that can be either Query or Body discovery extension type DiscoveryExtension struct { Info DiscoveryInfo json:info Schema JSONSchema json:schema RouteTemplate string json:routeTemplate,omitempty }omitempty保证静态路由下该字段不序列化线上响应体保持紧凑。对消费 402 响应的客户端/Agent 而言增强后的 Bazaar 扩展 JSON 形如{ info: { input: { type: http, method: GET, pathParams: { userId: 123 } } }, schema: { ...: 声明时构建的输入/输出 JSON Schema }, routeTemplate: /users/:userId }从源码结构看routeTemplate的设计定位是目录键catalog key同一个动态路由的所有请求都归一到同一模板而pathParams承载运行时具体取值两者在 resource_service.go 与EnrichDeclaration中保持数据 schema 原子一致的写入方式。验证与适用前提运行验证仓库只读环境下可按 go/Makefile 或直接go test ./extensions/bazaar/...运行 bazaar_test.go 的TestBazaarDynamicRoutes动态路由用例组以及 server_extensions_test.go 中的激活回归用例观察routeTemplate/pathParams断言是否全部通过。适用前提本机制依赖HTTPRequestContext.Adapter提供实际请求路径GetPath()与RoutePattern仅对走x402HTTPResourceServer.ProcessHTTPRequest的 HTTP 路由生效MCP 扩展与未注册扩展不参与增强。升级影响由于EnrichExtensions对所有既有路由生效升级到 v2.7.0 及以后版本时若你的路由声明了自定义服务端扩展需要确认其EnrichDeclaration实现对每次请求被调用这一行为是安全的幂等、无副作用。小结v2.7.0 是一次面向机器可读性的升级——动态路由的路由模板与运行时路径参数现在会被写进 402 响应的 Bazaar 发现扩展中Agent 类客户端无需再猜测:userId这类参数如何填值而EnrichExtensions的全面启用则为后续版本继续扩展请求时增强能力铺好了管道。【免费下载链接】x402A payments protocol for the internet. Built on HTTP.项目地址: https://gitcode.com/GitHub_Trending/x4/x402创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门