如何在golang中处理HTTP超时错误和访问状态代码

时间:2015-08-16 18:22:18

标签: go timeout http-status-codes

我有一些用Go编写的代码(见下文),它应该“扇出”HTTP请求,然后整理/聚合细节。

  

我是golang的新手,所以期待我成为一个nOOb并且我的知识有限

程序的输出目前类似于:

{
    "Status":"success",
    "Components":[
        {"Id":"foo","Status":200,"Body":"..."},
        {"Id":"bar","Status":200,"Body":"..."}, 
        {"Id":"baz","Status":404,"Body":"..."}, 
        ...
    ]
}

运行本地服务器故意慢(睡眠5秒然后返回响应)。但我列出了其他网站(见下面的代码),有时也会触发错误(如果错误,那就没关系。)

我目前遇到的问题是如何最好地处理这些错误,特别是“超时”相关的错误;因为我不确定如何识别故障是超时还是其他错误?

目前我一直收到一揽子错误:

Get http://localhost:8080/pugs: read tcp 127.0.0.1:8080: use of closed network connection

http://localhost:8080/pugs通常是失败的网址(希望超时!)。但是从代码中可以看到(下面),我不确定如何确定错误代码与超时有关,也不确定如何访问响应的状态代码(我目前只是将其设置为{{ 1}}但显然这是不对的 - 如果服务器出错了我会期望类似404状态代码,显然我想在我发回的聚合响应中反映出来。

完整代码如下所示。任何帮助表示赞赏。

500

2 个答案:

答案 0 :(得分:1)

如果你想散开然后聚合结果,并且你想要net / http包没有给你特定的超时行为,那么你可能想要使用goroutines和channel。

我今天刚观看了这个视频,它将使用Go的并发功能引导您完成这些场景。另外,扬声器Rob Pike非常有权威 - 他解释得比我更好。

https://www.youtube.com/watch?v=f6kdp27TYZs

答案 1 :(得分:-1)

Go 1.5版本通过更具体地说明它所处理的错误类型来解决这个问题。

因此,如果您看到此示例https://github.com/Integralist/Go-Requester/blob/master/requester.go#L38,您将看到我能够将错误消息模式应用于错误消息,以便在错误确实超时时解密

status := checkError(err.Error())

func checkError(msg string) int {
    timeout, _ := regexp.MatchString("Timeout", msg)

    if timeout {
        return 408
    }

  return 500
}