doujiu6976 2014-04-26 01:25
浏览 49

马丁尼&Appengine / golang,返回内存缓存的JSON数据

I am now coding with Martini and AppEngine/Go.

I want to use memcache to serve JSON data. But the response is invalid JSON format.Why "null" is in the response?

null{"results":[{"Title":"Nikkei225","PriceTime":"2014-04-25 06:28:00 UTC","Price":"14,429.26","Diff":"+24.27(0.1%)"},{"Title":"USD/JPY","PriceTime":"2014-04-25 20:49:00 UTC","Price":"102.12-102.16","Diff":"-0.15(-0.1%)"},{"Title":"EURO/JPY","PriceTime":"2014-04-25 20:49:00 UTC","Price":"141.28-141.32","Diff":"-0.19(-0.1%)"},{"Title":"EURO/USD","PriceTime":"2014-04-25 20:48:00 UTC","Price":"1.3833-1.3836","Diff":"+0.0002(0.0%)"},{"Title":"USD/CNY","PriceTime":"2014-04-25 20:48:00 UTC","Price":"6.2536-6.2546","Diff":"+0.0063(0.1%)"},{"Title":"DJIA","PriceTime":"2014-04-25 07:29:00 UTC","Price":"16,361.46","Diff":"-140.19(-0.8%)"},{"Title":"Nasdaq","PriceTime":"2014-04-25 07:00:00 UTC","Price":"4,075.561","Diff":"-72.777(-1.7%)"},{"Title":"FTSE100","PriceTime":"2014-04-25 07:35:00 UTC","Price":"6,685.69","Diff":"-17.31(-0.2%)"}]}

And console says like below:

http: multiple response.WriteHeader calls

My code is like below.
Retrieve from cache:

    c := appengine.NewContext(req)
    memcacheKey := "markets"
    results := []Result{}
    cachedItem, getCacheErr := memcache.JSON.Get(c, memcacheKey,&map[string]interface{}{"results": results})
    if getCacheErr != nil && getCacheErr != memcache.ErrCacheMiss {
        c.Infof("get cache error")
    }
    if getCacheErr == nil {
        c.Infof("cached data found")
        c.Infof("cached data: %v",cachedItem.Value)
        r.JSON(200, cachedItem.Object)
    } else {
        c.Infof("cached data not found")
    }

Set to memcache:

    client := urlfetch.Client(c)
    resp, err := client.Get("http://www.nikkei.com/markets/kaigai/worldidx.aspx")
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
    indexes := Indexes()
    doc, _ := goquery.NewDocumentFromResponse(resp)
    doc.Find("div.mk-world_market div table tr").Each(func(_ int, s *goquery.Selection) {
            title := s.Find("th").Text()
            title = strings.Trim(strings.Replace(title,"※","",-1)," ")
            if val,ok := indexes[title]; ok {
                price := s.Find("th").Next().Text()
                diff := s.Find("td:nth-child(3)").Text()
                pricetime := s.Find("td:nth-child(4)").Text()
                t := time.Now()
                pricetime = StringToTime(pricetime,t)
                result := Result{val,pricetime,price,diff}
                results = append(results,result)
            }
    })
    item := &memcache.Item{
        Key:memcacheKey,
        Object: &map[string]interface{}{"results": results},
    }
    setErr := memcache.JSON.Set(c, item)
    if setErr != nil {
        c.Infof("set error: %v",setErr)
    }

What is wrong with my code?

  • 写回答

1条回答 默认 最新

  • douduan7295 2014-04-26 10:53
    关注

    self-resolution:

    What I want to do is below.

        m.Get("/api/Markets", func(w http.ResponseWriter,r render.Render,req *http.Request) {
        c := appengine.NewContext(req)
        memcache_key := "markets"
        var item_list []Result
        results := []Result{}
        _, get_cache_err := memcache.JSON.Get(c,memcache_key,&item_list)
        if get_cache_err != nil && get_cache_err != memcache.ErrCacheMiss {
            c.Infof("get cache error")
        }
        if get_cache_err == nil {
            c.Infof("cached data found")
            c.Infof("cached data: %v",item_list)
            results = item_list
        } else {
            c.Infof("cached data not found")
            client := urlfetch.Client(c)
            resp, err := client.Get("http://www.nikkei.com/markets/kaigai/worldidx.aspx")
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
            }
            indexes := Indexes()
            doc, _ := goquery.NewDocumentFromResponse(resp)
            doc.Find("div.mk-world_market div table tr").Each(func(_ int, s *goquery.Selection) {
                title := s.Find("th").Text()
                title = strings.Trim(strings.Replace(title,"※","",-1)," ")
                if val,ok := indexes[title]; ok {
                    price := s.Find("th").Next().Text()
                    diff := s.Find("td:nth-child(3)").Text()
                    pricetime := s.Find("td:nth-child(4)").Text()
                    t := time.Now()
                    pricetime = StringToTime(pricetime,t)
                    result := Result{val,pricetime,price,diff}
                    results = append(results,result)
                }
            })
            item_list = results
            item := &memcache.Item{
                Key:memcache_key,
                Object: &item_list,
            }
            setErr := memcache.JSON.Set(c, item)
            if setErr != nil {
                c.Infof("set error: %v",setErr)
            }
        }
        r.JSON(200, map[string]interface{}{"results": item_list})
    })
    
    评论

报告相同问题?

悬赏问题

  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题