json - Gorilla / rpcを使用したGolangでのJSON RPCリクエスト

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


私にはいくつかの問題があります:


Access-Control-Allow-Originを引数として取りませんので、クロスドメインリクエストに対してhttp.ResponseWriter(通常のウェブサーバーを使用)で通常行うようにhttp.ResponseWriterヘッダーを設定する方法がわかりません。
HelloService.Sayメソッドにアクセスするために実際に何を送信しますか?私は{ method: "HelloService.Say", params:[{Who: "Me"}]}を試しましたが、405 (Method Not Allowed)を取得しました(ただし、これはx-domainリクエストを作成できないためかどうかはわかりません)。


どんな洞察も大歓迎です。
答え
編集:「型の同義語」の不適切な使用を修正する

番号1の場合:

Gorilla/rpc/jsonCodecRequest.WriteResponse(Gorilla/rpcCodecRequestを実装)は、コードがhttp.ResponseWriterに接するone placeです。

これは、CORSヘッダーを設定するCodecRequestの独自の実装が必要であることを意味します。

サーバーが使用するすべてのCodecRequestは、実際にはCodecによって生成されます。 Codecは、別の言い方をすると、CodecRequestsを作成するためのファクトリーです。

つまり、CORSヘッダーを設定するCodecを生成するには、CodecRequestを作成する必要があります。

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


それは楽しい練習でした!
関連記事

java - Java Gsonはjsonをオブジェクトにシリアル化します

javascript - javascript / ajaxログインシステム

javascript - Githubの要点エンドポイントがJavascriptで機能しない

php - ネストされたオブジェクトのjson_encodeの拡張

python - simplejsonを使用してPythonでTwitterからJSONファイルをデコードする

java - 文字列からJSONへの変換の問題

c# - ファイルまたはアセンブリを読み込めませんでしたServiceStack.Text指定されたファイルが見つかりません

vb.net - vb.netのrequest.querystring

json - JSONをFreemarkerテンプレート(FTL)に取り込む方法

php - PHPを使用してjqplotグラフを作成する