golang:通过http.Get请求获取的json,后续处理如何优化?

神州浪子 发布于 2014/08/20 17:16
阅读 2K+
收藏 0

源代码如下:

package main

import (
	"fmt"
	"io/ioutil"
	"net/http"
)

func main() {


//模拟ios客户端发送get请求
	client := new(http.Client)
	reg, err := http.NewRequest("GET",  `https://itunes.apple.com/WebObjects/MZStore.woa/wa/viewTop?cc=cn&genreId=36&popId=27`, nil)
	if err != nil {
		fmt.Println("Error1:", err)
		return
	}
	reg.Header.Set(`HTTP`, `2.0`)
	reg.Header.Set(`Accept`, `*/*`)
	reg.Header.Set(`Accept-Language`, `zh-cn`)
	reg.Header.Set(`User-Agent`, `AppStore/2.0 iOS/7.1.2 model/iPod5,1 build/11D257 (4; dt:81)`)
	reg.Header.Set(`Host`, `itunes.apple.com`)
	reg.Header.Set(`Connection`, `keep-alive`)
	reg.Header.Set(`X-Apple-Store-Front`, `143465-19,21 t:native`)
	reg.Header.Set(`X-Dsid`, `932530590`)
	//reg.Header.Set(`Cookie`, `xp_ci=3z1E7umazD0Dz5SBzCwNzB7weVKgD; s_vi=[CS]v1|29F61F868501299A-60000114E000452B[CE]; Pod=20; itspod=20; xt-src=b; xt-b-ts-932530590=1408324780262; mz_at_ssl-932530590=AwUAAAFRAAER1gAAAABT8vlrAo2EAZQvwAJjChIlGtIxIKYErLQ=; mz_at0-932530590=AwQAAAFRAAER1gAAAABT8VSrdHM0dXgdzosavj4+sT0AJfhYBx4=; wosid-lite=qQmZVeBH9vj91TakAeKEZg; ns-mzf-inst=35-163-80-118-68-8171-202429-20-nk11; X-Dsid=932530590`)

//执行get请求
	resp, err := client.Do(reg)
	defer resp.Body.Close()
	if err != nil {
		fmt.Println("Error2:", err)
		return
	}

//分隔符
	body, err := ioutil.ReadAll(resp.Body)
	if err != nil {
		return
	}
	fmt.Println(string(body))
}



可以看到最后打印出的是个json。

我的问题是:在分隔符处,json已经存放在resp.Body里了。我们知道golang对json的处理是要转换成[]byte的形式的。可这里如果先用

body, err := ioutil.ReadAll(resp.Body)

然后再将body转换成string类型,最后再将string类型转换为[]btyte的形式,感觉上很麻烦,而且性能上经过这几次转换也有一定消耗。

在分隔符处,是否有更简便的方案将resp.Body内的json转换为[]byte的形式以方便后续的处理呢?

加载中
0
hell0cat
hell0cat

你不用 ioutil.ReadAll 取出 resp.Body ,怎么使用?

body, err := ioutil.ReadAll(resp.Body)

后,body就是 []byte的形式,干嘛还要先转换成string 再转换成 []byte?找麻烦?

神州浪子
神州浪子
还真没发现ioutil.ReadAll以后就已经是[]byte形式了。。。 嗯 是个疏忽。。 最佳答案给你了,多谢解答
0
刘地
刘地

而且你干嘛要读出来?

json包本来就可以直接使用Reader接口的啊?

神州浪子
神州浪子
咦,不是只能读取二进制数据流的么。。
0
刘地
刘地

引用来自“刘地”的评论

而且你干嘛要读出来?

json包本来就可以直接使用Reader接口的啊?

你似乎理解有误啊。

不管是二进制流和文本流内在都是一样的,这个区别是针对程序员的,二进制流不能肉眼直接读,文本流可以直接读,仅此而已。

刘地
刘地
回复 @神州浪子 : 看json包里NewDecoder函数和它的Decode方法。
神州浪子
神州浪子
可否给个简单的code演示一下? 刚读了一下encoding/json标准库 很不得要领
返回顶部
顶部