![](/img/trans.png)
[英]Convert interface{} parameter into *http.Request or *http.Response in Go
[英]Reading a Buffer and Rewriting it to a http.Response in Go
我想在golang中編寫HTTP代理。 我將此模塊用於代理: https : //github.com/elazarl/goproxy 。 當有人使用我的代理時,它會調用一個http.Response作為輸入的函數。 我們稱之為“resp”。 resp.Body是一個io.ReadCloser。 我可以使用它的Read方法從它讀入一個[]字節數組。 但是后來它的內容從resp.Body中消失了。 但我必須返回一個http.Response與Body讀取到[]字節數組。 我怎樣才能做到這一點?
問候,
馬克斯
我的代碼:
proxy.OnResponse().DoFunc(func(resp *http.Response, ctx *goproxy.ProxyCtx) *http.Response {
body := resp.Body
var readBody []byte
nread, readerr := body.Read(readBody)
//the body is now empty
//and i have to return a body
//with the contents i read.
//how can i do that?
//doing return resp gives a Response with an empty body
}
你將不得不首先閱讀所有的身體,所以你可以正確地關閉它。 讀完整個實體后,只需將Response.Body
替換為緩沖區即可。
readBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
// handle error
}
resp.Body.Close()
// use readBody
resp.Body = ioutil.NopCloser(bytes.NewReader(readBody))
這是因為io.Reader
更多地充當緩沖區,當你讀取它時,你已經在緩沖區中消耗了這些數據並留下了一個空體。 要解決這個問題,你只需要關閉響應體並在體外創建一個新的ReadCloser
,它現在是一個字符串。
import "io/ioutil"
readBody, err := ioutil.ReadAll(resp.Body)
if err != nil {
//
}
resp.Body.Close()
resp.Body = ioutil.NopCloser(bytes.NewReader(readBody))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.