我有一些用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
答案 0 :(得分:1)
如果你想散开然后聚合结果,并且你想要net / http包没有给你特定的超时行为,那么你可能想要使用goroutines和channel。
我今天刚观看了这个视频,它将使用Go的并发功能引导您完成这些场景。另外,扬声器Rob Pike非常有权威 - 他解释得比我更好。
答案 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
}