我正在尝试使用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)
}
我有几个问题:
我不确定如何设置Access-Control-Allow-Origin
标头,就像我通常会在http.ResponseWriter
(使用常规网络服务器)上设置跨域请求,因为这不需要一个http.ResponseWriter
作为参数。
我实际发送什么来访问HelloService.Say
方法?我已经尝试了{ method: "HelloService.Say", params:[{Who: "Me"}]}
,但我得到405 (Method Not Allowed)
(不确定这是因为我不能发出x-domain请求?)
非常感谢任何见解。
答案 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/cors
和justinas/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)
}