使用 curl 调用 Go 标准库 RPC 服务(JSON-RPC 协议详解)

使用 curl 调用 Go 标准库 RPC 服务(JSON-RPC 协议详解) Go 的 net/rpc 默认基于自定义二进制协议不支持直接通过 HTTP curl 调用但启用 rpc/jsonrpc 后可暴露 JSON-RPC 1.0 接口此时可通过 curl 发送标准 JSON-RPC 请求与 Go RPC 服务交互。 go 的 net/rpc 默认基于自定义二进制协议不支持直接通过 http curl 调用但启用 rpc/jsonrpc 后可暴露 json-rpc 1.0 接口此时可通过 curl 发送标准 json-rpc 请求与 go rpc 服务交互。Go 标准库的 net/rpc 包默认使用私有、基于 TCP 的二进制编码协议Gob不兼容 HTTP 协议栈因此无法直接用 curl 发起常规 HTTP 请求如 GET/POST进行调用。这也是你执行 curl -X CONNECT --url localhost:1234/_goRPC 时收到 404 Not Found 的根本原因该端点并非 HTTP 服务器而是一个裸 TCP RPC 服务不理解 HTTP 方法或路径语义。? 正确路径是切换至 net/rpc/jsonrpc 子包——它在保持 net/rpc 服务逻辑不变的前提下将传输层封装为 JSON-RPC 1.0 格式并通过标准 HTTP通常是 POST承载。注意虽然协议名为 JSON-RPC但 Go 的 jsonrpc 实现实际复用 HTTP 连接且要求使用 POST 方法非 CONNECT这是社区常见误区。? 正确的 curl 调用方式JSON-RPC 1.0假设你已按如下方式启动了 JSON-RPC 服务关键使用 jsonrpc.ServeConn 或 http.HandlerFunc 包装// server.gopackage mainimport ( log net net/http net/rpc net/rpc/jsonrpc)type Args struct{ A, B int }type Arith intfunc (t *Arith) Multiply(r *Args, ret *int) error { *ret r.A * r.B return nil}func main() { rpc.Register(new(Arith)) rpc.HandleHTTP() // 注意此行注册 /_goRPC 路径仅对 jsonrpc 有效 listener, _ : net.Listen(tcp, :1234) log.Println(RPC server listening on :1234) http.Serve(listener, nil)}此时服务监听 :1234并通过 / _goRPC 路径提供 JSON-RPC 接口由 rpc.HandleHTTP() 自动注册。你可使用以下 curl 命令调用 Arith.Multiply 方法 Mokker AI AI产品图添加背景