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

2021-01-11 19:58:47 +08:00
 dimlau
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)
}

这样写是不是很丑?

2262 次点击
所在节点    Go 编程语言
16 条回复
pabupa
2021-01-11 20:06:45 +08:00
302 ?
fx
2021-01-11 20:08:09 +08:00
不用 Golang 最快
Cuo
2021-01-11 20:09:56 +08:00
不能直接从前段请求吗?
tcsky
2021-01-11 20:30:34 +08:00
丑没关系, 好用啊.
有个 sjson 库可以直接改 json 字符串.
dimlau
2021-01-11 20:31:52 +08:00
@Cuo
@fx
@pabupa

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

请问,各位意思是说,即便这样也比上边那样处理得快吗?
dimlau
2021-01-11 20:33:03 +08:00
@tcsky 好嘞,我也去找找看
neoblackcap
2021-01-11 22:45:21 +08:00
@dimlau 是不是示例代码漏了一些?我好像没看到有"}"插入进去
按我的理解,如果仅仅是字符串拼接,不涉及到序列化与反序列化,各种库底层修改的逻辑应该大同小异。最多可能会比你这个高效那么一点,区别应该不大。仅仅是 API 封装了,可能好看一点罢了。
有的封装还有可能有额外的开销。看你的选择
jay777
2021-01-11 22:48:01 +08:00
sjson gjson
jinliming2
2021-01-11 22:50:40 +08:00
不要 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) // 写出剩余数据
jinliming2
2021-01-11 22:52:41 +08:00
@neoblackcap 他 http response 里应该是一个完整的 JSON,{.....},下面他把第一个 { 去掉拼上了前面的那一段,} 是原来的 JSON 里就有的
neoblackcap
2021-01-11 22:53:54 +08:00
@jinliming2 哦,你不说我都没搞懂,的确是这样
treblex
2021-01-12 09:09:38 +08:00
如果是 json 的话 写个 struct 绑定 或者绑定 map[string]interface{},然后在修改会方便点吧,
直接拼字符串是因为有性能要求吗
hongweiliuruige
2021-01-12 10:19:31 +08:00
确实丑啊,,
qq1340691923
2021-01-12 11:29:21 +08:00
这种操作就不该 go 来处理,node 做中间层不香吗
dimlau
2021-01-12 12:07:25 +08:00
@jinliming2 请问,#9 这样依然还是野路子吗?
是不是一般不会这样处理?

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

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/743972

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX