You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:30:19