Go与PHP之间的JSON-RPC通信实现技术问询
Go 端 JSON-RPC 服务端完整实现(基于官方
net/rpc包) 我帮你把这段代码补全并整理好,这个服务端提供了乘法和除法两个RPC方法,刚好可以用来和PHP客户端做跨语言JSON-RPC通信:
package main import ( "errors" "log" "net" "net/http" "net/rpc" ) // Args RPC调用的参数结构体,用于传递两个整数参数 type Args struct { A, B int } // Quotient 除法操作的返回结果结构体,包含商和余数 type Quotient struct { Quo, Rem int } // Arith 绑定RPC方法的载体类型 type Arith int // Multiply 乘法RPC方法:接收Args参数,将乘积写入reply指针返回 func (t *Arith) Multiply(args *Args, reply *int) error { *reply = args.A * args.B return nil } // Divide 除法RPC方法:接收Args参数,返回商和余数到Quotient指针,处理除零异常 func (t *Arith) Divide(args *Args, quo *Quotient) error { if args.B == 0 { return errors.New("divide by zero") } quo.Quo = args.A / args.B quo.Rem = args.A % args.B return nil } func main() { // 注册Arith类型的RPC服务 arith := new(Arith) err := rpc.Register(arith) if err != nil { log.Fatal("register error:", err) } // 将RPC服务挂载到HTTP协议上,方便PHP通过HTTP请求调用 rpc.HandleHTTP() // 监听8080端口启动服务 l, err := net.Listen("tcp", ":8080") if err != nil { log.Fatal("listen error:", err) } log.Println("RPC server started on :8080") http.Serve(l, nil) }
关键细节说明:
- 所有RPC方法必须遵循**
func (t *T) MethodName(args *ArgsType, reply *ReplyType) error**的签名规范,这是net/rpc包的硬性要求 - 我们用HTTP承载RPC请求,这样PHP客户端可以通过标准的POST请求发送JSON格式的调用请求,无需额外复杂的协议处理
- 除零错误会被正确捕获并返回给客户端,PHP侧可以直接拿到错误信息做后续处理
和PHP通信的小提示:
PHP客户端需要构造符合JSON-RPC 2.0规范的请求体,比如调用乘法的请求示例:
{ "jsonrpc": "2.0", "method": "Arith.Multiply", "params": [{"A": 10, "B": 5}], "id": 1 }
请求的Content-Type要设置为application/json,发送到服务端的http://你的Go服务地址:8080/_goRPC路径即可。
内容的提问来源于stack exchange,提问作者itcoder
相关产品推荐
相关产品推荐

