Golang - Ristretto Cache 返回 base 64

我在使用 ristretto 缓存时遇到问题。事实上,我有一个小 api 应该返回我存储在我的 ristretto 缓存中作为 json 的值。


问题是当我调用我的函数时,返回的是用base64编码的json,我只是找不到解码它的方法。


这是我的代码:


第 1 部分:初始化我的 ristretto 缓存的代码:

func InitCache() {

    var err error

    ristrettoCache, err = ristretto.NewCache(&ristretto.Config{

        NumCounters: 3000,

        MaxCost: 1e6,

        BufferItems: 64,

    })

    if err != nil {

        panic(err)

    }

}

第 2 部分:将我的值放入缓存中:


for _, t := range listTokensFromDB {

    b, err := json.Marshal(t)

    if err != nil {

        fmt.Println(err)

    }

    ristrettoCache.Set(t.Symbol, b, 1)

}

第 3 部分:从缓存中获取值


func getTokenInfo(w http.ResponseWriter, r *http.Request){

    vars := mux.Vars(r)

    key := vars["chain"]+vars["symbol"]

    value, found := ristrettoCache.Get(key)

    if !found {

        return

    }

    json.NewEncoder(w).Encode(value)

}

当我调用我的 api 时,我得到的结果是:


"eyJTeW1ib2wiOiJic2NDUllQVE8iLCJBZGRyIjoiMHgyQmNBMUFlM0U1MjQ0NzMyM0IzRWE0NzA4QTNkMTg1ODRDYWY4NWE3IiwiTHBzIjpbeyJTeW1ib2xUb2tlbiI6IkZFRyIsIlRva2VuQWRkciI6IjB4YWNGQzk1NTg1RDgwQWI2MmY2N0ExNEM1NjZDMWI3YTQ5RmU5MTE2NyIsIkxwQWRkciI6IjB4NDU5ZTJlMjQ4NGNlMDU2MWRmNTJiYzFlNjkxMzkyNDA2M2JhZDM5MCJ9LHsiU3ltYm9sVG9rZW4iOiJmQk5CIiwiVG9rZW5BZGRyIjoiMHg4N2IxQWNjRTZhMTk1OEU1MjIyMzNBNzM3MzEzQzA4NjU1MWE1Yzc2IiwiTHBBZGRyIjoiMHg3OGM2NzkzZGMxMDY1OWZlN2U0YWJhMTQwMmI5M2Y2ODljOGY0YzI3In1dfQ=="


但我想要base64解码的版本......


如果我在将值 b 插入缓存时将其更改为字符串,如下所示:


for _, t := range listTokensFromDB {

        b, err := json.Marshal(t)

        if err != nil {

            fmt.Println(err)

        }


        ristrettoCache.Set(t.Symbol, string(b), 1)

    }

当我得到响应时,我得到这样的字符串化 json:“{“Symbol”:“bscCRYPTO”,“Addr”:“0x2BcA1Ae3E52447323B...”


而且我找不到摆脱这个字符串的方法:/


有人会知道我怎样才能得到真正的json吗?


提前谢谢你,祝你有美好的一天!


慕丝7291255
浏览 148回答 1
1回答

慕村225694

根据我的评论,我的意思是,在这一行中,value最有可能是类型[]byte(或[]uint8- 这是同一件事)value, found := ristrettoCache.Get(key)JSON 编码 a[]byte将隐式地 base64 输出 - 因为 JSON 是基于文本的。json.NewEncoder(w).Encode(value) // <- value is of type []byte检查您发布的 base64 ( https://play.golang.org/p/NAVS4qRfDM2 ) 底层二进制字节已经用 JSON 编码 - 所以不需要额外json.Encode的。只需在处理程序中输出原始字节 - 并将内容类型设置为application/json:func getTokenInfo(w http.ResponseWriter, r *http.Request){&nbsp; &nbsp; vars := mux.Vars(r)&nbsp; &nbsp; key := vars["chain"]+vars["symbol"]&nbsp; &nbsp; value, found := ristrettoCache.Get(key)&nbsp; &nbsp; if !found {&nbsp; &nbsp; &nbsp; &nbsp; return&nbsp; &nbsp; }&nbsp; &nbsp; // json.NewEncoder(w).Encode(value) // not this&nbsp; &nbsp; w.Header().Set("Content-Type", "application/json")&nbsp; &nbsp; if bs, ok := value.([]byte); ok {&nbsp; &nbsp; &nbsp; &nbsp; _, err := w.Write(bs) //raw bytes (already encoded in JSON)&nbsp; &nbsp; &nbsp; &nbsp; // check 'err'&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; &nbsp; // error unexpected type behind interface{}&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript