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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何在Golang中处理纯文本HTTP Get响应?相关的知识,希望对你有一定的参考价值。

我正在向返回纯文本响应的端点发出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
答案

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

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)

另一答案

使用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())

输出:

*Hello World* B=µH *

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

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)
    

另一答案

使用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())

以上是关于如何在Golang中处理纯文本HTTP Get响应?的主要内容,如果未能解决你的问题,请参考以下文章

HTTP请求在Golang中写入响应后中止

golang http库的使用 并发 get post请求处理

如何使用 Golang 的 net/http 包读取流响应正文?

Golang:如何使用 DES 和 CBC 加密 5 个字符长的纯文本?

如何在 HTTP 403 响应中获取自定义错误响应文本

带有文本/纯文本响应的 API 因“不可接受的内容类型”而失败