DEV Community

Discussion on: API Design: Errors

Collapse
 
theodesp profile image
Theofanis Despoudis • Edited

What about?

func WithRetry(req *http.Request) (*http.Response, error)  {
    res, err := http.DefaultClient.Do(req) // or pass a client here
    if err != nil {
        if IsRetryable(err) {
            // retry
        } else {
            // bail
        }
    }
    return res, nil
}

func main() {
    req, err := http.NewRequest("GET", "https://example.com", nil)
    if err != nil {
        fmt.Fprintln(os.Stderr, err.Error())
        os.Exit(1)
    }
    res, err := WithRetry(req)
    ...
}
Collapse
 
samwho profile image
Sam Rose • Edited

That looks perfectly reasonable. I was mostly avoiding Go's actual "net/http" package. Not for any particular reason, it's a nice API, just wanted a slightly different approach. :)

Collapse
 
theodesp profile image
Theofanis Despoudis • Edited

I think retries and traffic management flow should be left on the service mesh level.
There is a good read here

istio.io/docs/concepts/traffic-man...

I would also love to see something like that in Go
thepollyproject.org/

Thread Thread
 
samwho profile image
Sam Rose

Definitely good arguments to be made in favour of that, but somewhat outside of the scope of this post. 😀