Доступ к HTTP-ответу в виде строки в Go


125

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

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правильно пишет ответ в файл.

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

Ответы:


223

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 «s ответ ), это преобразование (см спецификации ).
См. « Насколько дорого []byte(string)? » (Обратная проблема, но применим тот же вывод), где упоминается zzzz :

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

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

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


Спасибо. Есть ли у вас какие-нибудь предложения, как я мог разобраться в этом самостоятельно? Как это делает string ()? Почему я не могу увидеть это с помощью reflection.TypeOf?
Tibor Szasz

1
@TiborSzasz Это простое преобразование: см. Blog.golang.org/slices#TOC_12 .
VonC

Небольшим улучшением вашего кода было бы использование http.StatusOKвместо сырого 200значения!
Shadoninja 01

Я делал это и обнаружил, что в моих телах запросов всегда есть символ новой строки в конце. Это нормально для тела запроса или это вызвано ioutil.ReadAll()??
sixty4bit

30

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

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

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

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

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

1

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.