Доступ до відповіді HTTP як рядок у Go


123

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

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правильно записує відповідь на файл.

Я вже перевірив посилання на пакет, але це не дуже корисно.

Відповіді:


221

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 ()? Чому я не можу побачити це за допомогою refle.TypeOf?
Tibor Szasz

1
@TiborSzasz Це просте перетворення: див. Blog.golang.org/slices#TOC_12 .
VonC

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

Я робив це і виявив, що в органах моїх запитів у кінці завжди є таблиця нового рядка. Це нормально для органу запиту чи це спричинено ioutil.ReadAll()??
шістдесят біт

29

Метод, який ви використовуєте для читання відповіді тела http, повертає байтовий фрагмент:

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

офіційна документація

Ви можете конвертувати []byteв рядок, використовуючи

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

1

рядок (byteslice) перетворить байтовий фрагмент в рядок, просто знайте, що це не тільки просто перетворення типу, але і копія пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.