Как обрабатывать текстовые сообщения HTTP Get get в Golang?
Я делаю HTTP GET для конечной точки, которая возвращает ответ, который имеет обычный текстовый ответ.
Как захватить строку текстового ответа?
Мой код выглядит следующим образом
url := "http://someurl.com"
response,err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
responseString := //NOT SURE HOW TO GRAB THE PLAIN TEXT STRING
Ответы
Ответ 1
Ответ тела может быть прочитан с использованием любого метода, который мог бы считывать данные из входящего потока байтов. Простейшей из них является функция ReadAll, предоставляемая в пакете ioutil.
responseData,err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
Он даст вам ответ API в [] байте. Если ответ представляет собой простой текст, вы можете легко преобразовать его в строку с использованием преобразования типа:
responseString := string(responseData)
И проверьте результат
fmt.Println(responseString)
Пример программы:
package main
import (
"fmt"
"io/ioutil"
"log"
"net/http"
)
func main() {
url := "http://country.io/capital.json"
response, err := http.Get(url)
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
responseData, err := ioutil.ReadAll(response.Body)
if err != nil {
log.Fatal(err)
}
responseString := string(responseData)
fmt.Println(responseString)
}
Ответ 2
Используйте ioutil.ReadAll(response.Body)
.
Также вы можете обрабатывать текст Unicode, используя bufio.NewScanner(response.Body)
как этот рабочий пример кода:
package main
import (
"bufio"
"bytes"
"fmt"
"log"
"net/http"
)
func main() {
response, err := http.Get("http://127.0.0.1")
if err != nil {
log.Fatal(err)
}
defer response.Body.Close()
scanner := bufio.NewScanner(response.Body)
scanner.Split(bufio.ScanRunes)
var buf bytes.Buffer
for scanner.Scan() {
buf.WriteString(scanner.Text())
}
fmt.Println(buf.String())
}
вывод:
*Hello World* B=µH *
Используя этот пример кода веб-сервера:
package main
import (
"fmt"
"log"
"net/http"
)
func ServeHTTP(w http.ResponseWriter, r *http.Request) {
body := "*Hello World* B=µH *"
fmt.Fprint(w, body)
}
func main() {
http.HandleFunc("/", ServeHTTP)
if err := http.ListenAndServe(":80", nil); err != nil {
log.Fatal(err)
}
}
Ответ 3
С io.Copy
вы читаете все байты из io.Reader и записываете его в файл io.Writer
resp, err := http.Get(server.URL + "/v1/ping")
if err != nil {
t.Errorf("failed to execute GET request: %s", err)
}
defer resp.Body.Close()
var b bytes.Buffer
if _, err := io.Copy(&b, resp.Body); err != nil {
t.Errorf("failed to copy response body: %s", err)
}
fmt.Println(b.String())