- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我总是被 io.ReadCloser 困住,然后忘记我以前读过它,当我再次阅读它时,我得到一个空的负载。我希望对我的愚蠢进行一些 lint 检查。尽管如此,我认为我可以使用 TeeReader,但它在这里没有达到我的期望:
func main() {
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
buf := &bytes.Buffer{}
tee := io.TeeReader(r.Body, buf)
body, err := ioutil.ReadAll(tee)
if err != nil {
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
log.Println("body", string(body))
payload, err := httputil.DumpRequest(r, true)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
log.Println("dump request", string(payload))
w.WriteHeader(http.StatusOK)
})
log.Fatal(http.ListenAndServe(":8080", nil))
}
正文从我的“转储请求”日志行中丢失。
即当我运行 curl -i -X POST --data '{"username":"xyz","password":"xyz"}' http://localhost:8080
我想要完整的原始请求:
2019/01/14 11:09:50 dump request POST / HTTP/1.1
Host: localhost:8080
Accept: */*
Content-Length: 35
Content-Type: application/x-www-form-urlencoded
User-Agent: curl/7.63.0
{"username":"xyz","password":"xyz"}
我错过了什么?
最佳答案
你不能回退 io.ReadCloser
,除非基础值也是 io.ReadSeeker
.
根据定义,io.ReadCloser
恰好有两个方法:Read
和 Close
。所以显然没有倒带的选项。
相比之下,io.ReadSeeker
有两种方法:Read
和 Seek
,后者允许倒带。
如果您只需要接受同样可搜索的 io.ReadCloser
,您可以轻松地将这两者结合起来:
type ReadSeekCloser interface {
io.Reader
io.Seeker
io.Closer
}
现在您可以使用自定义 ReadSeekCloser
类型代替 io.ReadCloser
,并且您可以选择倒回阅读器。
当然,很少有 io.ReadCloser
实际符合这个接口(interface)(os.File
将是主要的)。如果您有一个未实现 Seek
方法的 io.ReadCloser
(例如网络流),可能是实现它的最简单方法 Seek
able 是将内容转储到文件中,然后打开该文件。还有其他方法可以使内存缓冲区可搜索(例如 bytes.NewReader
),但变体将需要首先将流读入内存或磁盘。
关于http - 如何倒带 io.ReadCloser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54175360/
有人可以解释(或/和分享示例)何时以及为什么应该明确关闭读者,即实现 io.ReadCloser,而不仅仅是 io.Reader。 最佳答案 例如,当您使用文件或任何应关闭以释放分配的资源(或内存,例
我正在创建一个缓冲区,然后通过zip.NewWriter()写入该缓冲区 所以我的代码看起来像这样 // Create a buffer to write our archive to. buf :=
我总是被 io.ReadCloser 困住,然后忘记我以前读过它,当我再次阅读它时,我得到一个空的负载。我希望对我的愚蠢进行一些 lint 检查。尽管如此,我认为我可以使用 TeeReader,但它在
我从 http 服务获取数据,我想即时解压它。这是我目前的方法: resp, err := http.Get(url) if err != nil { logger.Fatalf("Can't
我有一个很大的 io.ReadCloser,它是从我的 HTTP 处理函数中的 http.Request 获得的。我需要将请求代理到另一台服务器,但首先我想在正文中找到与 Title: (\w+) 之
我有一个非常简单的 Go 网络服务器。它的工作是接收入站 json 有效负载。然后它将有效负载发布到一个或多个需要字节数组的服务。无需检查有效负载。刚发过来。 在这种情况下,它会接收入站作业并将其发送
我有一个 http 请求,我需要检查它的正文。但是当我这样做时,请求失败了。我假设这与需要重置的阅读器有关,但沿着 go ioutil reset ReadCloser 的行谷歌搜索没有发现任何看起来
我需要找到一种方法来从 io.ReadCloser 对象中读取一行,或者找到一种在“结束行”符号上拆分字节数组的方法。但是我不知道结束线符号,我找不到它。 我的应用程序执行一个 php 脚本,需要从脚
给定一个 io.ReadCloser,例如从 HTTP 请求的响应中,在内存开销和代码可读性方面将响应流式传输到文件的最有效方法是什么? 最佳答案 io.Copy在代码方面无疑是最高效的;你只需要 o
在 response.go 源代码的定义中,定义了 io.ReadCloser 类型的 Body但是在通过以下代码打印 Body 的类型时,它会打印 *http.http2gzipReader .他们
目标 我想将数据从阅读器发送到我的服务器。 (在示例中是 NopCloser,稍后它将是 exec.Command 的 Stdout) 问题 请求永远不会结束。即使我手动关闭 cmdOut,程序也永远
这个问题在这里已经有了答案: Golang io/ioutil NopCloser (3 个答案) 关闭 4 年前。 我有一个不需要关闭的 io.Reader: stringReader := st
我有一个客户端发出下载文件的请求,Web 服务器将此请求转发到实际保存该文件的资源服务器。从资源服务器返回的 *http.Response 有 Body io.ReaderCloser 从资源服务器流
我正在尝试从 S3 下载文件并将该文件上传到 S3 中的另一个存储桶。 Copy API 在这里不起作用,因为我被告知不要使用它。 从 S3 获取对象有一个 response.Body,它是一个 io
关闭。这个问题是not reproducible or was caused by typos .它目前不接受答案。 想改进这个问题?将问题更新为 on-topic对于堆栈溢出。 2年前关闭。 Imp
我似乎无法解决这个奇怪的错误。这是我的代码: resp, err := http.Get("example.com/my/text/file.conf") ... err = parseEvent(e
我是一名优秀的程序员,十分优秀!