Golang中的JSON RPC请求与Gorilla / rpc

时间:2012-10-12 01:44:28

标签: json go rpc json-rpc

我正在尝试使用Gorilla/rpc包来设置RPC以接收请求并回复响应(显然)。

首先,我尝试使用Gorilla/rpc

提供的示例

这是我的代码:

type HelloArgs struct {
    Who string
}

type HelloReply struct {
    Message string
}

type HelloService struct{}

func (h *HelloService) Say(r *http.Request, args *HelloArgs, reply *HelloReply) error {
    reply.Message = "Hello, " + args.Who + "!"
    return nil
}

func main() {
    r := mux.NewRouter()

    jsonRPC := rpc.NewServer()
    jsonCodec := json.NewCodec()
    jsonRPC.RegisterCodec(jsonCodec, "application/json")
    jsonRPC.RegisterCodec(jsonCodec, "application/json; charset=UTF-8") // For firefox 11 and other browsers which append the charset=UTF-8
    jsonRPC.RegisterService(new(HelloService), "")
    r.Handle("/api", jsonRPC)

    http.ListenAndServe(":"+port, nil)
}

我有几个问题:

  1. 我不确定如何设置Access-Control-Allow-Origin标头,就像我通常会在http.ResponseWriter(使用常规网络服务器)上设置跨域请求,因为这不需要一个http.ResponseWriter作为参数。

  2. 我实际发送什么来访问HelloService.Say方法?我已经尝试了{ method: "HelloService.Say", params:[{Who: "Me"}]},但我得到405 (Method Not Allowed)(不确定这是因为我不能发出x-domain请求?)

  3. 非常感谢任何见解。

2 个答案:

答案 0 :(得分:2)

已编辑:修复对“类型同义词”的错误使用

对于数字1:

Gorilla/rpc/json的{​​{1}}(实现CodecRequest.WriteResponse的{​​{1}})是 one place ,代码触及了Gorilla/rpc

这意味着我们必须拥有自己的CodecRequest实现来设置CORS头。

服务器使用的每个http.ResponseWriter实际上是由CodecRequest生成的; CodecRequest是制作Codec的工厂,换句话说。

这意味着我们必须创建Codec来生成将设置CORS标头的CodecRequests

关于Go的好处在于,组合这种额外的行为真的很容易!

试试这个:

Codec

这是一项有趣的练习!

答案 1 :(得分:0)

我知道这是一个很老的问题,但实际上有一种更简单的方法可以实现。

多行rs/corsjustinas/alice软件包使您可以做到这一点。

func main() {
    chain := alice.New(cors.Default().Handler)

    server := rpc.NewServer()
    server.RegisterCodec(json2.NewCodec(), "application/json")
    server.RegisterService(new(HelloService), "")

    http.Handle("/rpc", chain.Then(server))

    http.ListenAndServe(":8081", nil)
}