【问题标题】:Golang http request POST works onceGolang http 请求 POST 工作一次
【发布时间】:2018-11-22 20:49:01
【问题描述】:

我有主人和奴隶。 Master有api调用结果,它采用JSON。而且我有从机的问题,它在主机上发送这个结果,第一次我的代码很好地发送了 json,但第二次,当在主机上创建查询时,resp, err := client.Do(req) 上的代码停止(程序等待.....)。 救命码:

func main (){
    for {
        // some code, very long code
        sendResult(resFiles)
    }
}

func sendResult(rf common.ResultFiles) {
    jsonValue, err := json.Marshal(rf)
    req, err := http.NewRequest(methodPost, ResultAdress, 
                                bytes.NewBuffer(jsonValue))
    req.Header.Set("Content-Type", ContentType)
    client := &http.Client{}
    resp, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()
    fmt.Println("response Status:", resp.Status)
}

主 api 调用:

func result(c echo.Context) error {
    rf := &ResultFiles{}
    err := c.Bind(rf)
    if err != nil {
        log.Fatal(err)
    }
    rfChannel <- *rf
    return c.JSON(http.StatusOK, nil)
}

我的问题:为什么?标准客户端golang(http.Client)或超时可能有问题?如果我设置了 timout - 我的代码因超时而崩溃)))预期.... 谢谢!

【问题讨论】:

  • 首先验证问题出在哪里,客户端还是服务器。如果您从其他一些工具执行 http post 两次,服务器是否工作,例如通过使用curl ?在这种情况下,问题出在您的客户端,或者如果您使用现有工具发布到服务器也遇到了同样的问题,那么问题出在您的服务器上。
  • 我检查 - 我的主人有问题 - 频道有问题。
  • 好的,那么你不需要发布客户端代码,而是你的服务器代码。 (我们无法仅根据您在此处发布的一小段代码来调试您的服务器代码)
  • 我明白了,但我第一次认为奴隶有问题,现在我解决问题并发布结果)))谢谢

标签: json http go


【解决方案1】:

您需要为您的 http.Client 添加超时。默认情况下,http.Client 将超时指定为 0,这意味着根本没有超时。因此,如果服务器没有响应,那么您的应用程序只会挂起等待响应。这个问题在这篇文章Don’t use Go’s default HTTP client (in production)中有完整的描述。虽然您创建了自定义客户端,但您仍然需要指定超时时间。

【讨论】:

  • 我阅读了这篇文章并设置了超时,但我收到超时错误。我认为可能是主人的问题,但是当我的奴隶等待回答时,我打电话给我的主人,我 jerk api 打电话给我的主人,他给我一个答案。怎么样?
  • 如果不查看此端点的 master 代码,很难判断。如果我不得不猜测 - 检查代码是否存在无限循环、休眠和阻塞操作(例如,将消息添加到缓冲通道)。
  • 我添加了主码,是的,我的主码中有频道。
  • 我评论了在主节点上发送结果到通道的代码,主节点工作良好,请参阅通道的问题链接。
【解决方案2】:

与通道的问题链接,我将结果工作从主机发送到通道,但通道工作没有循环,我添加循环以从通道读取数据和所有工作。

【讨论】:

    猜你喜欢
    • 2018-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-22
    • 1970-01-01
    相关资源
    最近更新 更多