Goor中带有Gorilla / 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)

}

我有几个问题:


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


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


任何见解,不胜感激。


炎炎设计
浏览 199回答 2
2回答

ABOUTYOU

修正对“类型同义词”的错误使用对于数字1:Gorilla/rpc/json的CodecRequest.WriteResponse(它实现Gorilla/rpc的CodecRequest)是一个位置,其中所述代码的接触http.ResponseWriter。这意味着我们必须有自己的实现CodecRequest来设置CORS标头。CodecRequest服务器使用的每一个实际上都是由Codec;生成的;Codecs是制造工厂CodecRequests,换句话说。这意味着我们必须创建一个Codec来生成CodecRequest将设置CORS标头的。Go的伟大之处在于,编写这种额外的行为真的很容易!试试这个:package cors_codecimport (    "Gorilla/rpc"    "net/http"    "strings")//interface: ain't nobody dope like me I feel so fresh and cleanfunc CodecWithCors([]string corsDomains, unpimped rpc.Codec) rpc.Codec {    return corsCodecRequest{corsDomains, unpimped}}type corsCodecRequest struct {    corsDomains []string    underlyingCodecRequest rpc.CodecRequest}//override exactly one method of the underlying anonymous field and delegate to it.func (ccr corsCodecRequest) WriteResponse(w http.ResponseWriter, reply interface{}, methodErr error) error {    w.Header().add("Access-Control-Allow-Origin", strings.join(ccr.corsDomains, " "))    return ccr.underlyingCodecRequest.WriteResponse(w, reply, error)}type corsCodec struct {    corsDomains []string    underlyingCodec rpc.Codec}//override exactly one method of the underlying anonymous field and delegate to it.func (cc corsCodec) NewRequest(req *http.Request) rpc.CodecRequest {  return corsCodecRequest{cc.corsDomains, cc.underlyingCodec.NewRequest(req)}}那是一个有趣的练习!
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go