登录
首页 >  Golang >  Go问答

从 ReadCloser 发送 HTTP Put 正文永远不会结束

来源:stackoverflow

时间:2024-03-31 23:03:37 153浏览 收藏

积累知识,胜过积蓄金银!毕竟在Golang开发的过程中,会遇到各种各样的问题,往往都是一些细节知识点还没有掌握好而导致的,因此基础知识点的积累是很重要的。下面本文《从 ReadCloser 发送 HTTP Put 正文永远不会结束》,就带大家讲解一下知识点,若是你对本文感兴趣,或者是想搞懂其中某个知识点,就请你继续往下看吧~

问题内容

目标

我想从阅读器中将数据发送到我的服务器。 (在示例中为 nopcloser,稍后它将成为 exec.command 的标准输出)

问题

请求永远不会结束。即使我手动关闭 cmdout,程序也永远不会结束。具体:它永远不会到达“请求完成”行,并且永远不会调用 wg.done()

陷阱

所有数据都正确发送到服务器(即使使用 exec.command stdout)。但是 http.defaultclient.do 似乎仍在监听 readcloser 为空后(并在主例程中关闭)

代码

cmdOut := ioutil.NopCloser(bytes.NewBuffer([]byte("Hallo DU")))

var wg sync.WaitGroup
wg.Add(1)
go func() {
    defer wg.Done()

    // localhost:1234 is a netcat server: "nc -l -p 1234"
    req, _ := http.NewRequest("PUT", "http://localhost:1234", cmdOut)

    resp, err := http.DefaultClient.Do(req)
    if err != nil {
        log.Println(err)
        return
    }

    // Never reaches this line
    log.Println("Request Done")
}()

cmdOut.Close()

log.Println("Wait for go routine")
wg.Wait()
log.Println("DONE")

解决方案


问题不在于发送请求,而在于接收响应。

您正在向 netcat 发送请求,netcat 只会丢弃该请求,不执行任何其他操作。这使得 HTTP 客户端库等待 HTTP 响应,但该响应永远不会到来。

解决方案是与实际的 HTTP 服务器通信。

终于介绍完啦!小伙伴们,这篇关于《从 ReadCloser 发送 HTTP Put 正文永远不会结束》的介绍应该让你收获多多了吧!欢迎大家收藏或分享给更多需要学习的朋友吧~golang学习网公众号也会发布Golang相关知识,快来关注吧!

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