Documentation
¶
Overview ¶
Example ¶
package main
import (
"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.DoWithFunc(ctx, r, func(r *http.Response) error {
if r.StatusCode != http.StatusOK {
return klient.UnexpectedResponseError(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) BodyJSON() interface{} {
return r
}
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
}
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 LimitedResponse(resp *http.Response) []byte
- func NewRetryPolicy(opts ...optionRetryFn) retryablehttp.CheckRetry
- func Request(ctx context.Context, baseURL, method, path string, body io.Reader, ...) error
- func RetryPolicy(ctx context.Context, resp *http.Response, err error) (bool, error)
- func UnexpectedResponse(resp *http.Response) error
- func UnexpectedResponseError(resp *http.Response) error
- type Client
- type InfBody
- type InfBodyJSON
- type InfHeader
- type InfQueryStringGenerator
- type InfRequest
- type InfRequestValidator
- type Null
- type OptionRetryValue
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ErrValidating = fmt.Errorf("failed to validate request") ErrMarshal = fmt.Errorf("failed to marshal request body") ErrRequest = fmt.Errorf("failed to do request") ErrResponseFuncNil = fmt.Errorf("response function is nil") )
var OptionClient = optionClient{}
var OptionRetry = optionRetry{}
var ResponseErrLimit int64 = 1 << 20 // 1MB
Functions ¶
func LimitedResponse ¶
LimitedResponse not close body, retry library draining it.
func NewRetryPolicy ¶
func NewRetryPolicy(opts ...optionRetryFn) retryablehttp.CheckRetry
func Request ¶
func Request(ctx context.Context, baseURL, method, path string, body io.Reader, header http.Header, fn func(*http.Response) error) error
Request sends an HTTP request and calls the response function with the global client.
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.
func UnexpectedResponseError ¶
UnexpectedResponseError returns an error with the response body.
Types ¶
type Client ¶
type Client struct {
HTTPClient *http.Client
BaseURL *url.URL
// contains filtered or unexported fields
}
func New ¶
New creates a new http client with the provided options.
Default BaseURL is required, it can be disabled by setting DisableBaseURLCheck to true.
func (*Client) Do ¶
func (c *Client) Do(ctx context.Context, req InfRequest, resp interface{}) error
Do sends an HTTP request and json unmarshals the response body to data.
Do work same as DoWithFunc with defaultResponseFunc.
func (*Client) DoWithFunc ¶
func (c *Client) DoWithFunc(ctx context.Context, req InfRequest, fn func(*http.Response) error) error
DoWithFunc sends an HTTP request and calls the response function.
Request additional implements InfRequestValidator, InfQueryStringGenerator, InfHeader, InfBody, InfBodyJSON.
type InfBodyJSON ¶
type InfBodyJSON interface {
// BodyJSON can return any type that can be marshaled to JSON.
// Automatically sets Content-Type to application/json.
BodyJSON() interface{}
}
type InfQueryStringGenerator ¶
type InfRequest ¶
type InfRequest interface {
// Method returns the HTTP method.
Method() string
// Path returns the path to be sent.
Path() string
}
InfRequest is the base interface for all requests.
type InfRequestValidator ¶
type InfRequestValidator interface {
// Validate returns error if request is invalid.
Validate() error
}
type OptionRetryValue ¶
type OptionRetryValue = optionRetryValue