Documentation
¶
Overview ¶
Example ¶
package main
import (
"bytes"
"context"
"encoding/json"
"fmt"
"net/http"
"net/http/httptest"
"github.com/worldline-go/klient"
)
type Client struct {
klient *klient.Client
}
func (c *Client) CreateX(ctx context.Context, r CreateXRequest) (*CreateXResponse, error) {
var v CreateXResponse
if err := c.klient.DoWithInf(ctx, r, func(r *http.Response) error {
if r.StatusCode != http.StatusOK {
return klient.ResponseError(r)
}
if err := json.NewDecoder(r.Body).Decode(&v); err != nil {
return err
}
return nil
}); err != nil {
return nil, err
}
return &v, nil
}
// ----
type CreateXRequest struct {
ID string `json:"id"`
}
func (CreateXRequest) Method() string {
return http.MethodPost
}
func (CreateXRequest) Path() string {
return "/api/v1/x"
}
func (r CreateXRequest) Validate() error {
if r.ID == "" {
return fmt.Errorf("id is required")
}
return nil
}
func (r CreateXRequest) Header() http.Header {
v := http.Header{}
v.Set("X-Info", "example")
return v
}
func (r CreateXRequest) Request(ctx context.Context) (*http.Request, error) {
if err := r.Validate(); err != nil {
return nil, err
}
bodyData, err := json.Marshal(r)
if err != nil {
return nil, fmt.Errorf("unable to marshal request body: %w", err)
}
body := bytes.NewReader(bodyData)
req, err := http.NewRequestWithContext(ctx, r.Method(), r.Path(), body)
if err != nil {
return nil, err
}
req.Header = r.Header()
return req, nil
}
type CreateXResponse struct {
RequestID string `json:"request_id"`
}
// ---
func main() {
httpServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// check request method
if r.Method != http.MethodPost {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid request method"}`))
return
}
// check request path
if r.URL.Path != "/api/v1/x" {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid request path"}`))
return
}
// check request header
if r.Header.Get("X-Info") != "example" {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid request header"}`))
return
}
// get request body
var m map[string]interface{}
if err := json.NewDecoder(r.Body).Decode(&m); err != nil {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid request body"}`))
return
}
// check request body
if m["id"] != "123" {
w.WriteHeader(http.StatusBadRequest)
w.Write([]byte(`{"error": "invalid id"}`))
return
}
// write response
w.WriteHeader(http.StatusOK)
w.Write([]byte(`{"request_id": "123+"}`))
}))
defer httpServer.Close()
httpxClient, err := klient.New(
klient.OptionClient.WithBaseURL(httpServer.URL),
)
if err != nil {
fmt.Println(err)
return
}
c := &Client{
klient: httpxClient,
}
v, err := c.CreateX(context.Background(), CreateXRequest{
ID: "123",
})
if err != nil {
fmt.Println(err)
return
}
fmt.Println(v.RequestID)
}
Output: 123+
Index ¶
- Variables
- func DrainBody(body io.ReadCloser)
- func LimitedResponse(resp *http.Response) []byte
- func NewRetryPolicy(opts ...OptionRetryFn) retryablehttp.CheckRetry
- func ResponseError(resp *http.Response) error
- func ResponseFuncJSON(data interface{}) func(*http.Response) error
- func RetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error)
- func UnexpectedResponse(resp *http.Response) error
- type Client
- type Null
- type OptionClientFn
- type OptionClientHolder
- func (OptionClientHolder) WithBackoff(backoff retryablehttp.Backoff) OptionClientFn
- func (OptionClientHolder) WithBaseURL(baseURL string) OptionClientFn
- func (OptionClientHolder) WithCtx(ctx context.Context) OptionClientFn
- func (OptionClientHolder) WithDisableBaseURLCheck(baseURLCheck bool) OptionClientFn
- func (OptionClientHolder) WithDisableRetry(disableRetry bool) OptionClientFn
- func (OptionClientHolder) WithHTTPClient(httpClient *http.Client) OptionClientFn
- func (OptionClientHolder) WithHeader(header http.Header) OptionClientFn
- func (OptionClientHolder) WithInsecureSkipVerify(insecureSkipVerify bool) OptionClientFn
- func (OptionClientHolder) WithLogger(logger logz.Adapter) OptionClientFn
- func (OptionClientHolder) WithMaxConnections(maxConnections int) OptionClientFn
- func (OptionClientHolder) WithPooledClient(pooledClient bool) OptionClientFn
- func (OptionClientHolder) WithRetryLog(retryLog bool) OptionClientFn
- func (OptionClientHolder) WithRetryMax(retryMax int) OptionClientFn
- func (OptionClientHolder) WithRetryOptions(opts ...OptionRetryFn) OptionClientFn
- func (OptionClientHolder) WithRetryPolicy(retryPolicy retryablehttp.CheckRetry) OptionClientFn
- func (OptionClientHolder) WithRetryWaitMax(retryWaitMax time.Duration) OptionClientFn
- func (OptionClientHolder) WithRetryWaitMin(retryWaitMin time.Duration) OptionClientFn
- func (OptionClientHolder) WithRoundTripper(f ...func(context.Context, http.RoundTripper) (http.RoundTripper, error)) OptionClientFn
- func (OptionClientHolder) WithTimeout(timeout time.Duration) OptionClientFn
- type OptionRetryFn
- type OptionRetryHolder
- func (OptionRetryHolder) WithOptionRetry(oRetry *OptionRetryValue) OptionRetryFn
- func (OptionRetryHolder) WithRetryDisable() OptionRetryFn
- func (OptionRetryHolder) WithRetryDisabledStatusCodes(codes ...int) OptionRetryFn
- func (OptionRetryHolder) WithRetryEnabledStatusCodes(codes ...int) OptionRetryFn
- func (OptionRetryHolder) WithRetryLog(log logz.Adapter) OptionRetryFn
- type OptionRetryValue
- type Requester
- type RoundTripperFunc
- type TransportKlient
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrCreateRequest = fmt.Errorf("failed to create request") ErrRequest = fmt.Errorf("failed to do request") ErrResponseFuncNil = fmt.Errorf("response function is nil") )
var OptionClient = OptionClientHolder{}
var OptionRetry = OptionRetryHolder{}
var ResponseErrLimit int64 = 1 << 20 // 1MB
var TransportHeaderKey ctxKlient = "HTTP_HEADER"
TransportHeaderKey is the context key to use with context.WithValue to specify http.Header for a request.
Functions ¶
func DrainBody ¶ added in v0.5.0
func DrainBody(body io.ReadCloser)
DrainBody reads the entire content of r and then closes the underlying io.ReadCloser.
func LimitedResponse ¶
LimitedResponse not close body, retry library draining it.
func NewRetryPolicy ¶
func NewRetryPolicy(opts ...OptionRetryFn) retryablehttp.CheckRetry
func ResponseError ¶ added in v0.3.0
ResponseError returns an error with the limited response body.
func ResponseFuncJSON ¶ added in v0.3.0
ResponseFuncJSON returns a response function that decodes the response into data with json decoder. It will return an error if the response status code is not 2xx.
If data is nil, it will not decode the response body.
func RetryPolicy ¶
RetryPolicy provides a default callback for Client.CheckRetry, which will retry on connection errors and server errors.
func UnexpectedResponse ¶
UnexpectedResponse returns an error if the response status code is not 2xx.
Types ¶
type Client ¶
func New ¶
func New(opts ...OptionClientFn) (*Client, error)
New creates a new http client with the provided options.
Default BaseURL is required, it can be disabled by setting DisableBaseURLCheck to true.
type OptionClientFn ¶ added in v0.1.2
type OptionClientFn func(*optionClientValue)
OptionClientFn is a function that configures the client.
type OptionClientHolder ¶ added in v0.1.1
type OptionClientHolder struct{}
func (OptionClientHolder) WithBackoff ¶ added in v0.1.1
func (OptionClientHolder) WithBackoff(backoff retryablehttp.Backoff) OptionClientFn
WithBackoff configures the client to use the provided backoff.
func (OptionClientHolder) WithBaseURL ¶ added in v0.1.1
func (OptionClientHolder) WithBaseURL(baseURL string) OptionClientFn
WithBaseURL configures the client to use the provided base URL.
func (OptionClientHolder) WithCtx ¶ added in v0.1.1
func (OptionClientHolder) WithCtx(ctx context.Context) OptionClientFn
WithCtx for TransportWrapper call.
func (OptionClientHolder) WithDisableBaseURLCheck ¶ added in v0.1.1
func (OptionClientHolder) WithDisableBaseURLCheck(baseURLCheck bool) OptionClientFn
WithDisableBaseURLCheck configures the client to disable base URL check.
func (OptionClientHolder) WithDisableRetry ¶ added in v0.1.1
func (OptionClientHolder) WithDisableRetry(disableRetry bool) OptionClientFn
WithDisableRetry configures the client to disable retry.
func (OptionClientHolder) WithHTTPClient ¶ added in v0.1.1
func (OptionClientHolder) WithHTTPClient(httpClient *http.Client) OptionClientFn
WithHTTPClient configures the client to use the provided http client.
func (OptionClientHolder) WithHeader ¶ added in v0.4.1
func (OptionClientHolder) WithHeader(header http.Header) OptionClientFn
WithHeader configures the client to use this default header if not exist.
func (OptionClientHolder) WithInsecureSkipVerify ¶ added in v0.1.1
func (OptionClientHolder) WithInsecureSkipVerify(insecureSkipVerify bool) OptionClientFn
WithInsecureSkipVerify configures the client to skip TLS verification.
func (OptionClientHolder) WithLogger ¶ added in v0.1.1
func (OptionClientHolder) WithLogger(logger logz.Adapter) OptionClientFn
WithLogger configures the client to use the provided logger.
For zerolog logz.AdapterKV{Log: logger} can usable.
func (OptionClientHolder) WithMaxConnections ¶ added in v0.1.1
func (OptionClientHolder) WithMaxConnections(maxConnections int) OptionClientFn
WithMaxConnections configures the client to use the provided maximum number of idle connections.
func (OptionClientHolder) WithPooledClient ¶ added in v0.1.1
func (OptionClientHolder) WithPooledClient(pooledClient bool) OptionClientFn
func (OptionClientHolder) WithRetryLog ¶ added in v0.1.1
func (OptionClientHolder) WithRetryLog(retryLog bool) OptionClientFn
WithRetryLog configures the client to use the provided retry log flag, default is true.
This option is only used with default retry policy.
func (OptionClientHolder) WithRetryMax ¶ added in v0.1.1
func (OptionClientHolder) WithRetryMax(retryMax int) OptionClientFn
WithRetryMax configures the client to use the provided maximum number of retry.
func (OptionClientHolder) WithRetryOptions ¶ added in v0.1.1
func (OptionClientHolder) WithRetryOptions(opts ...OptionRetryFn) OptionClientFn
func (OptionClientHolder) WithRetryPolicy ¶ added in v0.1.1
func (OptionClientHolder) WithRetryPolicy(retryPolicy retryablehttp.CheckRetry) OptionClientFn
WithRetryPolicy configures the client to use the provided retry policy.
func (OptionClientHolder) WithRetryWaitMax ¶ added in v0.1.1
func (OptionClientHolder) WithRetryWaitMax(retryWaitMax time.Duration) OptionClientFn
WithRetryWaitMax configures the client to use the provided maximum wait time.
func (OptionClientHolder) WithRetryWaitMin ¶ added in v0.1.1
func (OptionClientHolder) WithRetryWaitMin(retryWaitMin time.Duration) OptionClientFn
WithRetryWaitMin configures the client to use the provided minimum wait time.
func (OptionClientHolder) WithRoundTripper ¶ added in v0.3.0
func (OptionClientHolder) WithRoundTripper(f ...func(context.Context, http.RoundTripper) (http.RoundTripper, error)) OptionClientFn
WithRoundTripper configures the client to wrap the default transport.
func (OptionClientHolder) WithTimeout ¶ added in v0.2.2
func (OptionClientHolder) WithTimeout(timeout time.Duration) OptionClientFn
WithTimeout configures the client to use the provided timeout. Default is no timeout.
Warning: This timeout is for the whole request, including retries.
type OptionRetryFn ¶ added in v0.1.2
type OptionRetryFn func(*optionRetryValue)
type OptionRetryHolder ¶ added in v0.1.1
type OptionRetryHolder struct{}
func (OptionRetryHolder) WithOptionRetry ¶ added in v0.1.1
func (OptionRetryHolder) WithOptionRetry(oRetry *OptionRetryValue) OptionRetryFn
WithOptionRetry configures the retry policy directly.
This option overrides all other retry options when previously set.
func (OptionRetryHolder) WithRetryDisable ¶ added in v0.1.1
func (OptionRetryHolder) WithRetryDisable() OptionRetryFn
func (OptionRetryHolder) WithRetryDisabledStatusCodes ¶ added in v0.1.1
func (OptionRetryHolder) WithRetryDisabledStatusCodes(codes ...int) OptionRetryFn
func (OptionRetryHolder) WithRetryEnabledStatusCodes ¶ added in v0.1.1
func (OptionRetryHolder) WithRetryEnabledStatusCodes(codes ...int) OptionRetryFn
func (OptionRetryHolder) WithRetryLog ¶ added in v0.1.1
func (OptionRetryHolder) WithRetryLog(log logz.Adapter) OptionRetryFn
type OptionRetryValue ¶
type OptionRetryValue = optionRetryValue
type Requester ¶ added in v0.4.0
type Requester interface {
// Request returns the http.Request.
Request(context.Context) (*http.Request, error)
}
Requester is the base interface to send an HTTP request.
type RoundTripperFunc ¶ added in v0.4.1
type RoundTripperFunc = func(context.Context, http.RoundTripper) (http.RoundTripper, error)
type TransportKlient ¶ added in v0.5.0
type TransportKlient struct {
// Base is the base RoundTripper used to make HTTP requests.
// If nil, http.DefaultTransport is used.
Base http.RoundTripper
// Header for default header to set if not exist.
Header http.Header
// BaseURL is the base URL for relative requests.
BaseURL *url.URL
}
TransportKlient is an http.RoundTripper that wrapping a base RoundTripper and adding headers from context.
func (*TransportKlient) RoundTrip ¶ added in v0.5.0
RoundTrip authorizes and authenticates the request with an access token from Transport's Source.
func (*TransportKlient) SetHeader ¶ added in v0.5.0
func (t *TransportKlient) SetHeader(req *http.Request)
RoundTrip authorizes and authenticates the request with an access token from Transport's Source.