为了账号安全,请及时绑定邮箱和手机立即绑定

Goor中带有Gorilla / rpc的JSON RPC请求

Goor中带有Gorilla / rpc的JSON RPC请求

Go
炎炎设计 2021-05-15 02:37:14
我正在尝试使用该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域请求?)任何见解,不胜感激。
查看完整描述

2 回答

?
ABOUTYOU

TA贡献1812条经验 获得超5个赞

修正对“类型同义词”的错误使用

对于数字1:


Gorilla/rpc/json的CodecRequest.WriteResponse(它实现Gorilla/rpc的CodecRequest)是一个位置,其中所述代码的接触http.ResponseWriter。


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


CodecRequest服务器使用的每一个实际上都是由Codec;生成的;Codecs是制造工厂CodecRequests,换句话说。


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


Go的伟大之处在于,编写这种额外的行为真的很容易!


试试这个:


package cors_codec

import (

    "Gorilla/rpc"

    "net/http"

    "strings"

)

//interface: ain't nobody dope like me I feel so fresh and clean

func 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)}

}

那是一个有趣的练习!


查看完整回答
反对 回复 2021-05-17
  • 2 回答
  • 0 关注
  • 198 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信