Подтвердить что ты не робот

Получите доступ к HTTP-ответе как строку в Go

Я хотел бы проанализировать ответ веб-запроса, но у меня возникают проблемы с его доступом к строке.

func main() {
    resp, err := http.Get("http://google.hu/")
    if err != nil {
        // handle error
    }
    defer resp.Body.Close()
    body, err := ioutil.ReadAll(resp.Body)

    ioutil.WriteFile("dump", body, 0600)

    for i:= 0; i < len(body); i++ {
        fmt.Println( body[i] ) // This logs uint8 and prints numbers
    }

    fmt.Println( reflect.TypeOf(body) )
    fmt.Println("done")
}

Как получить доступ к ответу как строку? ioutil.WriteFile правильно записывает ответ на файл.

Я уже проверил ссылку на пакет, но это не очень полезно.

4b9b3361

Ответ 1

bs := string(body) должно быть достаточно, чтобы получить строку.

Оттуда вы можете использовать его как обычную строку.

Немного как в этой теме:

var client http.Client
resp, err := client.Get(url)
if err != nil {
    log.Fatal(err)
}
defer resp.Body.Close()

if resp.StatusCode == http.StatusOK {
    bodyBytes, err := ioutil.ReadAll(resp.Body)
    if err != nil {
        log.Fatal(err)
    }
    bodyString := string(bodyBytes)
    log.Info(bodyString)
}

Смотрите также GoByExample.

Как отмечено ниже (и в ответе zzn), это конверсия (см. Спецификацию).
Смотрите " Сколько стоит []byte(string)? " (Обратная проблема, но применяется тот же вывод), где упоминается zzzz:

Некоторые преобразования такие же, как приведение типа uint(myIntvar), который просто интерпретирует биты на месте.

Соня добавляет:

Создание строки из байтового фрагмента, безусловно, предполагает выделение строки в куче. Свойство неизменности заставляет это.
Иногда вы можете оптимизировать, выполняя как можно больше работы с байтом [], а затем создавая строку в конце. Тип bytes.Buffer часто бывает полезен.

Ответ 2

Метод, который вы используете для чтения ответа тела http, возвращает байт:

func ReadAll(r io.Reader) ([]byte, error)

официальная документация

Вы можете преобразовать []byte в строку, используя

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

Ответ 3

string (byteslice) преобразует байтовый срез в строку, просто знайте, что он не просто просто преобразует тип, но также копирует память.