在 JSON-RPC 方法中获取 websocket 连接信息

Posted

技术标签:

【中文标题】在 JSON-RPC 方法中获取 websocket 连接信息【英文标题】:Getting websocket connection information in JSON-RPC method 【发布时间】:2015-04-14 19:02:54 【问题描述】:

我在 Websocket 上使用 JSON-RPC。而且,在 RPC 方法中(例如,下面示例中的乘法),我需要知道哪个连接调用了该方法。下面的部分显示“// 此处需要 Websocket 连接信息”。我该怎么做?

package main

import (
    "code.google.com/p/go.net/websocket"
    "net/http"
    "net/rpc"
    "net/rpc/jsonrpc"
)

type Args struct 
    A int
    B int


type Arith int

func (t *Arith) Multiply(args *Args, reply *int) error 
    *reply = args.A * args.B
    // Need Websocket connection information here
    return nil


func main() 
    rpc.Register(new(Arith))
    http.Handle("/conn", websocket.Handler(serve))
    http.ListenAndServe("localhost:7000", nil)


func serve(ws *websocket.Conn) 
    jsonrpc.ServeConn(ws)

【问题讨论】:

【参考方案1】:

这将具有挑战性,因为它违反了 RPC 提供的抽象。这是一个策略建议:

Google 的许多 API 都使用上下文对象:https://blog.golang.org/context。该接口的一部分是任意数据的 Value 方法:

Value(key interface) interface

这将为您提供类似于线程本地存储的东西,这在其他编程语言中通常用于此目的。

那么如何在请求中添加上下文对象呢?一种方法是创建一个新的自定义ServerCodec

type ServerCodec interface 
    ReadRequestHeader(*Request) error
    ReadRequestBody(interface) error
    // WriteResponse must be safe for concurrent use by multiple goroutines.
    WriteResponse(*Response, interface) error

    Close() error

你的实现大部分可以反映jsonrpc的:

var params [1]interface
params[0] = x
return json.Unmarshal(*c.req.Params, &params)

但在返回之前,您可以使用一点反射,并在params 中查找名称/类型为Context 的字段,然后填充它。比如:

ctx := createContextSomehow()
v := reflect.ValueOf(x)
if v.Kind() == reflect.Ptr 
    v = v.Elem()
    if v.Kind() == reflect.Struct 
        ctxv := v.FieldByName("Context")
        ctxv.Set(ctx)
    

然后更改您的请求:

type Args struct 
    A int
    B int

改成:

type Args struct 
    A int
    B int
    Context context.Context

有点笨拙,但我认为你可以做到这一点。

【讨论】:

以上是关于在 JSON-RPC 方法中获取 websocket 连接信息的主要内容,如果未能解决你的问题,请参考以下文章

如何从 json-rpc webservice 获取数据:iPad /iPhone / Objective C

使用 javascript 异步函数通过 json-rpc 请求获取 Phantom 钱包余额的问题?

如何通过 Phantom 钱包集成使用 Vanilla JS 和 JSON-RPC 获取 Solana 帐户信息和/或 SOL 余额?

如何在 C# 中的 JSON-RPC 2.0 中编写“参数”?

连接到json-rpc接口

从 iOS 到 Android 的 Json-RPC 方法