https://github.com/globocom/httpclient
A HTTP client in Golang.
https://github.com/globocom/httpclient
circuit-breaker golang http-client library resilience retry-strategies
Last synced: 10 months ago
JSON representation
A HTTP client in Golang.
- Host: GitHub
- URL: https://github.com/globocom/httpclient
- Owner: globocom
- License: bsd-3-clause
- Created: 2022-10-06T19:16:42.000Z (over 3 years ago)
- Default Branch: main
- Last Pushed: 2024-04-18T12:57:25.000Z (about 2 years ago)
- Last Synced: 2025-04-06T08:36:37.931Z (about 1 year ago)
- Topics: circuit-breaker, golang, http-client, library, resilience, retry-strategies
- Language: Go
- Homepage:
- Size: 2.7 MB
- Stars: 14
- Watchers: 11
- Forks: 5
- Open Issues: 1
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# httpclient
A HTTP client implementation in GoLang.
# Examples
### 1. OAuth Authorization
```go
package example
import (
"context"
"log"
"time"
"github.com/globocom/httpclient"
"golang.org/x/oauth2/clientcredentials"
)
func main() {
timeout := 200 * time.Millisecond
contextTimeout, cancel := context.WithTimeout(context.Background(), timeout)
defer cancel()
credentials := clientcredentials.Config{
ClientID: "client_id",
ClientSecret: "client_secret",
TokenURL: "client_url/token",
Scopes: []string{"grant_permissions:client_credentials"},
}
client := httpclient.NewHTTPClient(httpclient.LoggerAdapter{Writer: log.Writer()},
httpclient.WithOAUTHTransport(credentials, timeout))
resp, err := client.NewRequest().
SetContext(contextTimeout).
Put("/authorize")
log.Printf("resp: %#v", resp)
log.Printf("err: %s", err)
}
```
### 2. Circuit Breaker with Timeout and Retries
```go
package example
import (
"log"
"time"
"github.com/slok/goresilience/circuitbreaker"
"github.com/globocom/httpclient"
)
func main() {
cbConfig := circuitbreaker.Config {
ErrorPercentThresholdToOpen: 5,
MinimumRequestToOpen: 50,
SuccessfulRequiredOnHalfOpen: 50,
WaitDurationInOpenState: 30 * time.Second,
MetricsSlidingWindowBucketQuantity: 5,
MetricsBucketDuration: 5 * time.Second,
}
timeout := 200 * time.Millisecond
retries := 1
backoff := 5 * time.Millisecond
maxBackoff := 10 * time.Millisecond
client := httpclient.NewHTTPClient(httpclient.LoggerAdapter{Writer: log.Writer()},
httpclient.WithDefaultTransport(timeout),
httpclient.WithTimeout(timeout),
httpclient.WithCircuitBreaker(cbConfig),
httpclient.WithRetries(retries, backoff, maxBackoff),
)
resp, err := client.NewRequest().
Get("/example")
log.Printf("resp: %#v", resp)
log.Printf("err: %s", err)
}
```
### 3. Callback Chain
```go
package example
import (
"log"
"github.com/globocom/httpclient"
)
func main() {
client := httpclient.NewHTTPClient(
httpclient.LoggerAdapter{Writer: log.Writer()},
httpclient.WithChainCallback(loggerCallback),
)
resp, err := client.NewRequest().Get("example.com")
log.Printf("resp: %#v", resp)
log.Printf("err: %s", err)
}
func loggerCallback(fn func() (*httpclient.Response, error)) (*httpclient.Response, error) {
resp, err := fn()
if resp != nil {
restyRequest := resp.Request().RestyRequest()
requestURL := restyRequest.RawRequest.URL
host := requestURL.Host
// If the client is initialized without WithHostURL, request.HostURL() is going to be nil
if requestHostURL := resp.Request().HostURL(); requestHostURL != nil {
host = requestHostURL.Host
}
responseTime := resp.ResponseTime().Microseconds()
log.Printf("%s [%s] %d -- %s (%dμs)", host, restyRequest.Method,
resp.StatusCode(), requestURL.String(), responseTime)
}
return resp, err
}
```