Golang Go语言中 请教:远程 Get 到复杂 JSON 极少修改之后传给前端用,怎么做最快捷高效?

发布于 1周前 作者 eggper 来自 Go语言

Golang Go语言中 请教:远程 Get 到复杂 JSON 极少修改之后传给前端用,怎么做最快捷高效?

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

//一写代码 //省略掉了 //var TOTID //r.Method == “GET”

w.Header().Set("Content-Type", "application/json")
resp, err := http.Get("///xxxxx.json")
if err != nil {
	panic(err)
}
defer resp.Body.Close()
body, _ :=ioutil.ReadAll(resp.Body)
addthis := fmt.Sprintf(`{"id":"%s",`,TOTID)
body = append([]byte(addthis),body[1:]...)
b=string(body)
fmt.Fprint(w, b)

}

这样写是不是很丑?


更多关于Golang Go语言中 请教:远程 Get 到复杂 JSON 极少修改之后传给前端用,怎么做最快捷高效?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html

17 回复

302 ?

更多关于Golang Go语言中 请教:远程 Get 到复杂 JSON 极少修改之后传给前端用,怎么做最快捷高效?的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


不用 Golang 最快

不能直接从前段请求吗?

丑没关系, 好用啊.
有个 sjson 库可以直接改 json 字符串.





json 地址里有 md5,而且新加的内容也是 go 从数据库里取出来的……
所以,如果要是前端做的话,得两次 fetch 。

请问,各位意思是说,即便这样也比上边那样处理得快吗?

好嘞,我也去找找看

是不是示例代码漏了一些?我好像没看到有"}"插入进去
按我的理解,如果仅仅是字符串拼接,不涉及到序列化与反序列化,各种库底层修改的逻辑应该大同小异。最多可能会比你这个高效那么一点,区别应该不大。仅仅是 API 封装了,可能好看一点罢了。
有的封装还有可能有额外的开销。看你的选择

不要 ioutil.ReadAll,你这个只是把 resp.Body 第一个字节去掉的话,这样写:
resp, err := http.Get("///xxxxx.json")
if err != nil {
panic(err)
}
defer resp.Body.Close()
fmt.Fprintf(w, {"id":"%s",, TOTID) // 格式化直接写出
io.CopyN(ioutil.Discard, resp.Body, 1) // 丢弃第一个字节
io.Copy(w, resp.Body) // 写出剩余数据

他 http response 里应该是一个完整的 JSON,{…},下面他把第一个 { 去掉拼上了前面的那一段,} 是原来的 JSON 里就有的

哦,你不说我都没搞懂,的确是这样

如果是 json 的话 写个 struct 绑定 或者绑定 map[string]interface{},然后在修改会方便点吧,
直接拼字符串是因为有性能要求吗

确实丑啊,,

这种操作就不该 go 来处理,node 做中间层不香吗

请问,#9 这样依然还是野路子吗?
是不是一般不会这样处理?

因为感觉如 所说写 struct 有点繁琐,用到的数据在 json 的不同层级,struct 要写好几层?
不如在前端用 js 取想要的就完了。

具体情况具体对待。你这个需求里面,resp.Body 完全没用,所以直接流转发就行,效率更高,不需要全读到内存里处理。
而其他的 xxjson 啦,struct 绑定啦之类的,都是要把整个 json 读到内存里,解析,然后修改,然后序列化,再写出,这个效率就很低了,对你这个需求来说就没有必要了。除非你需要对 resp.Body 做一些额外的处理。
当然,如果你的 jdon 很小的话,不在乎这点性能,而这样写又不够美观可读的话,那楼上的那些其他的方案也完全可以采用。
我觉得你这种简单的函数,只要写好注释,基本上没啥问题的。

在Golang中处理远程获取的复杂JSON数据,并对其进行少量修改后传递给前端,可以遵循以下步骤来实现快捷高效的处理:

  1. 使用http.Client获取数据: 使用net/http包的http.Client来发送GET请求,获取远程的JSON数据。

  2. 反序列化JSON: 使用encoding/json包的Unmarshal函数将获取的JSON数据反序列化为Go结构体。定义结构体时,可以基于JSON的结构进行映射。

  3. 修改数据: 直接对反序列化后的结构体进行需要的修改。由于只进行少量修改,这一步通常非常快速。

  4. 序列化数据传前端: 修改完成后,使用encoding/json包的Marshal函数将结构体序列化为JSON字符串,然后传递给前端。

  5. 优化建议

    • 并发处理:如果请求量大,可以考虑使用goroutine并发处理请求,提高吞吐量。
    • 缓存:如果数据变化不频繁,可以考虑引入缓存机制,减少远程请求次数。
    • 错误处理:在每一步都做好错误处理,确保程序的健壮性。
  6. 示例代码: 由于篇幅限制,这里不提供完整代码,但上述步骤对应的代码结构清晰,易于实现。

通过上述方法,你可以快捷高效地处理远程获取的复杂JSON数据,并传递给前端。

回到顶部