登录
首页 >  Golang >  Go问答

将 http.Response 转换为 byte 切片

来源:stackoverflow

时间:2024-03-07 23:12:26 339浏览 收藏

欢迎各位小伙伴来到golang学习网,相聚于此都是缘哈哈哈!今天我给大家带来《将 http.Response 转换为 byte 切片》,这篇文章主要讲到等等知识,如果你对Golang相关的知识非常感兴趣或者正在自学,都可以关注我,我会持续更新相关文章!当然,有什么建议也欢迎在评论留言提出!一起学习!

问题内容

我正在尝试开发一个 tcp 代理,在这个 tcp 代理中我必须同时操作 http 和 tcp 请求。

目前,对于传入请求,我检测它是 http 还是 tcp 请求,如果是 http,则将其解析为 http.request

func (s *tcpproxy) onmessage(c *connection.connection, ctx interface{}, data []byte) interface{} {
    reader := bytes.newreader(data)
    newreader := bufio.newreader(reader)
    req, err := http.readrequest(newreader)
    // this is an http request
}

现在我可以方便地操作请求,因为我可以使用从该接口公开的方法,然后最终我会将响应从我的代理发送回接收入站请求的服务。

func (s *TcpProxy) OnMessage(c *connection.Connection, ctx interface{}, data []byte) interface{} {
    reader := bytes.NewReader(data)
    newReader := bufio.NewReader(reader)
    req, err := http.ReadRequest(newReader)
    // Manipulate http request
    // ...
    // Proxy the request
    proxyReq, err := http.NewRequest(req.Method, proxyUrl, req.Body)

    // Capture the duration while making a request to the destination service.
    res, err := httpClient.Do(proxyReq)
    
    buf := res.ToBuffer() // <= How can I achieve this
   
    c.Send(buf)

    c.Close()
    return nil
}

但是我找不到将响应转换回字节或字符串数​​组的方法,我是否遗漏了什么?


正确答案


http.request 对象有一个 Write 方法:

func (r *request) write(w io.writer) error

write 以有线格式写入 http/1.1 请求,即标头和正文。

您可以使用它将字节写入缓冲区对象。例如:

package main

import (
    "bytes"
    "fmt"
    "net/http"
)

func main() {
    var buf bytes.Buffer

    req, err := http.NewRequest("GET", "http://google.com", nil)
    if err != nil {
        panic(err)
    }

    client := &http.Client{}
    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()

    if err := res.Write(&buf); err != nil {
        panic(err)
    }

    // ...do whatever you want with the buffer here...
    fmt.Println(buf.String())
}

buffer 对象有一个 Bytes 方法,如果您想要的话,它将返回一个字节数组。

今天关于《将 http.Response 转换为 byte 切片》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>