如何在Golang中处理纯文本HTTP Get响应?

The*_*boy 30 rest http go

我正在向返回纯文本响应的端点发出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
Run Code Online (Sandbox Code Playgroud)

May*_*tel 48

可以使用任何可以从传入字节流中读取数据的方法读取正文的响应.最简单的是ioutil包中提供的ReadAll函数.

responseData,err := ioutil.ReadAll(response.Body)
if err != nil {
    log.Fatal(err)
}
Run Code Online (Sandbox Code Playgroud)

它将以[]字节为您提供API响应.如果响应是纯文本,您可以使用类型转换轻松将其转换为字符串:

responseString := string(responseData)
Run Code Online (Sandbox Code Playgroud)

并检查结果

fmt.Println(responseString)
Run Code Online (Sandbox Code Playgroud)

示例程序:

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)
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您获得带有(例如)西班牙语/意大利语/等的网页。字符,则无法将[[] byte`转换为`string`。恰恰是诸如é,á等字符,您将获得字符。您需要迭代`responseData`并连接每个字符。一种优化的方法是[this](https://play.golang.org/p/IPKmytFOEd);-) (2认同)
  • @ToniVillena“西班牙语/意大利语/等字符,将`[]byte`转换为`string`时不会得到好的结果”——这是不正确的。如果您有一个有效的 UTF-8 字节切片(如果您 io.ReadAll 是一个 UTF-8 编码的 HTTP 响应),则可以直接打印将 `[]byte` 转换为 `string`。请参阅[游乐场](https://play.golang.org/p/x7b2F1wI3j8)。另一方面,如果您错误地/手动构造了一个字节切片,如[本例](https://play.golang.org/p/9GZ-J8a7iCv),那么您将得到�。 (2认同)

小智 5

使用ioutil.ReadAll(response.Body).

您也可以使用bufio.NewScanner(response.Body)
以下工作示例代码处理 Unicode 文本:

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())
}
Run Code Online (Sandbox Code Playgroud)

输出:

*Hello World* B=µH *
Run Code Online (Sandbox Code Playgroud)

使用此示例 Web 服务器代码:

*Hello World* B=µH *
Run Code Online (Sandbox Code Playgroud)


Ale*_*sta 5

从io.Copyio.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())
Run Code Online (Sandbox Code Playgroud)