Как получить ответ после http запроса - PullRequest
0 голосов
/ 16 ноября 2018

Я изучаю Go и я настоящий новичок в этой области.

Я сталкиваюсь с проблемой при попытке скопировать какое-либо значение.

Что я делаю, это:

  1. Я хочу получить ответ в [ответ], используя httpRequest.
httpClient := &http.Client{}
response, err := httpClient.Do(req)
if err != nil {
   panic(err)
}
  1. После этого я хочу сохранить сохраненное значение в ответ в файле origin.txt
origin_ ,_:= ioutil.ReadAll(response.Body)
f_, err := os.Create("origin.txt")
f_.Write(origin_);
  1. И я хочу получить конкретное значение с помощью пакета goquery.
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 голосов
/ 16 ноября 2018

На самом деле я не вижу, где вы используете общие ресурсы между 2 и 3.

Однако сказанное origin := *response не будет вам дорого стоить. Данные (response.Body) - это io.ReadCloser. ioutil.ReadAll() будет использовать и хранить все данные, которые есть в потоке. Вы можете сделать это только один раз.

Однако у вас есть данные, хранящиеся в origin. Если вам нужен еще один io.Reader для этих данных (скажем, для случая 3), вы можете сделать этот байт снова похожим на io.Reader: bytes.NewReader(origin).

...