patterngoCritical
Access HTTP response as string in Go
Viewed 0 times
stringresponseaccesshttp
Problem
I'd like to parse the response of a web request, but I'm getting trouble accessing it as string.
How can I access the response as string?
I've already checked the package reference but it's not really helpful.
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")
}How can I access the response as string?
ioutil.WriteFile writes correctly the response to a file. I've already checked the package reference but it's not really helpful.
Solution
bs := string(body) should be enough to give you a string.From there, you can use it as a regular string.
A bit as in this thread
(updated after Go 1.16 -- Q1 2021 --
ioutil deprecation: ioutil.ReadAll() => io.ReadAll()):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 := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
bodyString := string(bodyBytes)
log.Info(bodyString)
}See also GoByExample.
As commented below (and in zzn's answer), this is a conversion (see spec).
See "How expensive is
[]byte(string)?" (reverse problem, but the same conclusion apply) where zzzz mentioned:Some conversions are the same as a cast, like
uint(myIntvar), which just reinterprets the bits in place.Sonia adds:
Making a string out of a byte slice, definitely involves allocating the string on the heap. The immutability property forces this.
Sometimes you can optimize by doing as much work as possible with []byte and then creating a string at the end. The
bytes.Buffer type is often useful.Code Snippets
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 := io.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
bodyString := string(bodyBytes)
log.Info(bodyString)
}Context
Stack Overflow Q#38673673, score: 401
Revisions (0)
No revisions yet.