http请求后如何获得响应

时间:2018-11-16 06:43:39

标签: go goquery

我正在研究Go,并且是该领域的真正新手。

当我尝试复制一些值时遇到问题。

我正在做的是:

  
      
  1. 我想使用httpRequest在[响应]中得到一些响应。
  2.   
httpClient := &http.Client{}
response, err := httpClient.Do(req)
if err != nil {
   panic(err)
}
  
      
  1. 之后,我想将存储的值保存为'origin.txt'
  2.   
origin_ ,_:= ioutil.ReadAll(response.Body)
f_, err := os.Create("origin.txt")
f_.Write(origin_);
  
      
  1. 我想使用goquery包获取特定值。
  2.   
doc, err := goquery.NewDocumentFromReader(response.Body)
if err != nil {
    log.Fatal(err)
}
doc.Find(".className").Each(func(i int, s *goquery.Selection) {
    w.WriteString("============" + strconv.Itoa(i) + "============")
    s.Find("tr").Each(func(i int, s_ *goquery.Selection) {
    fmt.Println(s_.Text())
    w.WriteString(s_.Text())    
    })
}

但是在这种情况下,我可以从2)中得到我想要的值,但不能从3)中得到任何值。

首先,我认为问题是3)的响应对象受2)动作影响。因为它是参考对象。

所以我尝试将其复制到另一个对象,然后再次执行。

origin := *response

但是,我得到的结果与第一个相同。

我该怎么办? 如何通过参考值将参考值分配给另一个参考值?

我每次尝试都要两次吗?

1 个答案:

答案 0 :(得分:6)

我实际上看不到您在2到3之间使用共享资源的地方。

尽管如此,origin := *response并不会给您带来多少好处。数据(response.Body)是io.ReadCloserioutil.ReadAll()将使用并存储流中所有的数据。您只能执行一次。

但是,您已将数据存储在origin中。如果您需要另一个io.Reader用于该数据(例如情况3),则可以使该字节片再次看起来像io.Readerbytes.NewReader(origin)