Documentation
¶
Overview ¶
Example (Fasthttp_basicCall) ¶
Example_fasthttp_basicCall demonstrates how to make a simple HTTP call using the FastHTTP adapter.
type RepoInfo struct {
ID int `json:"id"`
Name string `json:"name"`
}
// Create a mocked endpoint for the example
endpoint := NewEndpoint("GithubAPI").
Request(BaseURL("https://api.github.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(`{"id": 12345, "name": "withttp"}`)))
res.SetStatus(http.StatusOK)
}),
)
call := NewCall[RepoInfo](NewMockHttpClientAdapter()).
URI("/repos/user/repo").
Method(http.MethodGet).
Header("User-Agent", "withttp-example", false).
ParseJSON().
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), endpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Repo ID: %d, Name: %s\n", call.BodyParsed.ID, call.BodyParsed.Name)
Output: Repo ID: 12345, Name: withttp
Example (Fasthttp_postRequest) ¶
Example_fasthttp_postRequest demonstrates how to make a POST request with JSON body using FastHTTP.
type CreateRequest struct {
Title string `json:"title"`
Body string `json:"body"`
}
type CreateResponse struct {
ID int `json:"id"`
URL string `json:"url"`
}
// Create a mocked endpoint for the example
endpoint := NewEndpoint("API").
Request(BaseURL("https://api.example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(
io.NopCloser(
strings.NewReader(`{"id": 42, "url": "https://api.example.com/items/42"}`),
),
)
res.SetStatus(http.StatusCreated)
}),
)
payload := CreateRequest{
Title: "Example Item",
Body: "This is an example",
}
call := NewCall[CreateResponse](NewMockHttpClientAdapter()).
URI("/items").
Method(http.MethodPost).
ContentType(ContentTypeJSON).
Body(payload).
Header("Authorization", "Bearer token", true).
ParseJSON().
ExpectedStatusCodes(http.StatusCreated)
err := call.CallEndpoint(context.Background(), endpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Created item ID: %d\n", call.BodyParsed.ID)
Output: Created item ID: 42
Example (Fasthttp_withHeaderFunc) ¶
Example_fasthttp_withHeaderFunc demonstrates using header functions with FastHTTP.
type APIResponse struct {
Message string `json:"message"`
}
endpoint := NewEndpoint("API").
Request(BaseURL("https://api.example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(`{"message": "Hello"}`)))
res.SetStatus(http.StatusOK)
}),
)
call := NewCall[APIResponse](NewMockHttpClientAdapter()).
URI("/hello").
Method(http.MethodGet).
HeaderFunc(func() (key, value string, override bool) {
key = "X-Timestamp"
value = "2025-06-29T12:00:00Z"
override = true
return
}).
HeaderFunc(func() (key, value string, override bool) {
key = "X-Request-ID"
value = "req-12345"
override = true
return
}).
ParseJSON().
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), endpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Response: %s\n", call.BodyParsed.Message)
Output: Response: Hello
Example (MockEndpoint) ¶
Example_mockEndpoint demonstrates how to create and use a mocked endpoint for testing.
type Order struct {
Amount float64 `json:"amount"`
Pair string `json:"pair"`
}
// Create a mocked endpoint that returns test data
mockEndpoint := NewEndpoint("MockExchange").
Request(BaseURL("http://example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(`{"amount": 100.5, "pair": "BTC/USD"}`)))
res.SetStatus(http.StatusOK)
}),
)
call := NewCall[Order](NewMockHttpClientAdapter()).
Method(http.MethodGet).
Header("Authorization", "Bearer token123", true).
ParseJSON().
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), mockEndpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Order amount: %.1f, Pair: %s\n", call.BodyParsed.Amount, call.BodyParsed.Pair)
Output: Order amount: 100.5, Pair: BTC/USD
Example (ParseCSV) ¶
Example_parseCSV demonstrates parsing CSV response data.
type Repository struct {
Rank int
Name string
Stars int
}
csvData := `rank,name,stars
1,awesome-go,75000
2,gin,65000`
endpoint := NewEndpoint("RepoStats").
Request(BaseURL("https://api.example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(csvData)))
res.SetStatus(http.StatusOK)
}),
)
parser := csvparser.New[Repository](
csvparser.SeparatorComma,
csvparser.IntCol[Repository](
csvparser.QuoteNone,
nil,
func(x *Repository, rank int) { x.Rank = rank },
),
csvparser.StringCol[Repository](
csvparser.QuoteNone,
nil,
func(x *Repository, name string) { x.Name = name },
),
csvparser.IntCol[Repository](
csvparser.QuoteNone,
nil,
func(x *Repository, stars int) { x.Stars = stars },
),
)
call := NewCall[Repository](NewMockHttpClientAdapter()).
URI("/top-repos.csv").
Method(http.MethodGet).
ParseCSV(1, parser, func(repo Repository) bool { // skip 1 header line
fmt.Printf("Rank %d: %s (%d stars)\n", repo.Rank, repo.Name, repo.Stars)
return true // continue processing
}).
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), endpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
Output: Rank 1: awesome-go (75000 stars) Rank 2: gin (65000 stars)
Example (ParseJSONEachRow) ¶
Example_parseJSONEachRow demonstrates parsing JSON-each-row format responses.
type Trade struct {
Price float64 `json:"price"`
Volume float64 `json:"volume"`
}
mockData := `{"price": 50000.0, "volume": 1.5}
{"price": 51000.0, "volume": 0.8}`
mockEndpoint := NewEndpoint("TradesAPI").
Request(BaseURL("http://example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(mockData)))
res.SetStatus(http.StatusOK)
}),
)
var trades []Trade
call := NewCall[Trade](NewMockHttpClientAdapter()).
Method(http.MethodGet).
ParseJSONEachRow(func(trade Trade) bool {
trades = append(trades, trade)
return true // continue processing
}).
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), mockEndpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Processed %d trades\n", len(trades))
if len(trades) > 0 {
fmt.Printf("First trade: $%.0f, volume: %.1f\n", trades[0].Price, trades[0].Volume)
}
Output: Processed 2 trades First trade: $50000, volume: 1.5
Example (RequestStream_fromSlice) ¶
Example_requestStream_fromSlice demonstrates streaming data from a slice to the server.
type DataPoint struct {
Timestamp int64 `json:"ts"`
Value float64 `json:"val"`
}
// Sample data to stream
data := []DataPoint{
{Timestamp: 1672531200, Value: 25.5},
{Timestamp: 1672531260, Value: 26.1},
{Timestamp: 1672531320, Value: 24.8},
}
stream := Slice[DataPoint](data)
mockEndpoint := NewEndpoint("DataIngestion").
Request(BaseURL("https://api.example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(`{"status": "received"}`)))
res.SetStatus(http.StatusOK)
}),
)
call := NewCall[any](NewMockHttpClientAdapter()).
URI("/data").
Method(http.MethodPost).
ContentType(ContentTypeJSONEachRow).
RequestStreamBody(
RequestStreamBody[any, DataPoint](stream),
).
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), mockEndpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("Data streamed successfully")
Output: Data streamed successfully
Example (RequestStream_withSniffer) ¶
Example_requestStream_withSniffer demonstrates streaming with request sniffing.
type Event struct {
Type string `json:"type"`
}
events := []Event{
{Type: "click"},
{Type: "view"},
}
stream := Slice[Event](events)
mockEndpoint := NewEndpoint("Analytics").
Request(BaseURL("https://api.example.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(`{"processed": true}`)))
res.SetStatus(http.StatusOK)
}),
)
call := NewCall[any](NewMockHttpClientAdapter()).
URI("/events").
Method(http.MethodPost).
ContentType(ContentTypeJSONEachRow).
RequestSniffed(func(data []byte, err error) {
if err == nil {
// Simplify output to avoid JSON formatting issues
if strings.Contains(string(data), "click") {
fmt.Println("Sending click event")
} else if strings.Contains(string(data), "view") {
fmt.Println("Sending view event")
}
}
}).
RequestStreamBody(
RequestStreamBody[any, Event](stream),
).
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), mockEndpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Println("Events processed")
Output: Sending click event Sending view event Events processed
Example (SingleCall) ¶
Example_singleCall demonstrates making a simple HTTP GET request.
type RepoInfo struct {
ID int `json:"id"`
Name string `json:"name"`
}
// Create a mocked endpoint for the example
endpoint := NewEndpoint("GithubAPI").
Request(BaseURL("https://api.github.com")).
Response(
MockedRes(func(res Response) {
res.SetBody(io.NopCloser(strings.NewReader(`{"id": 12345, "name": "withttp"}`)))
res.SetStatus(http.StatusOK)
}),
)
call := NewCall[RepoInfo](NewMockHttpClientAdapter()).
URI("/repos/user/repo").
Method(http.MethodGet).
Header("User-Agent", "withttp-example", false).
ParseJSON().
ExpectedStatusCodes(http.StatusOK)
err := call.CallEndpoint(context.Background(), endpoint)
if err != nil {
fmt.Printf("Error: %v\n", err)
return
}
fmt.Printf("Repo ID: %d, Name: %s\n", call.BodyParsed.ID, call.BodyParsed.Name)
Output: Repo ID: 12345, Name: withttp
Example (SingleCall_directURL) ¶
Example_singleCall_directURL demonstrates making a request directly to a URL without an endpoint.
type SimpleResponse struct {
Status string `json:"status"`
}
// For this example, we'll simulate a call but skip it in practice
// In real usage, you would just call without the skip
call := NewCall[SimpleResponse](NetHttp()).
URL("https://httpbin.org/json").
Method(http.MethodGet).
Header("User-Agent", "withttp-example", false).
ParseJSON().
ExpectedStatusCodes(http.StatusOK)
// For documentation purposes, we'll show what the call would look like
_ = call // Normally: err := call.Call(context.Background())
fmt.Println("This would make a direct HTTP call to the specified URL")
Output: This would make a direct HTTP call to the specified URL
Index ¶
- Variables
- func B2S(data []byte) string
- func BtsIsset(bts []byte) bool
- func BytesEquals(a, b []byte) bool
- func ConfigureHeader(req Request, key, value string, override bool) error
- func ContentTypeCodec(c string) (codec.Codec, error)
- func CreateAuthorizationHeader(kind authHeaderKind, user, pass string) (string, error)
- func EncodeBody(payload any, contentType string) (bts []byte, err error)
- func EncodeStream[T any](ctx context.Context, r rangeable[T], req Request, encoder codec.Encoder, ...) (err error)
- func ReadJSON[T any](rc io.ReadCloser) (res T, err error)
- func ReadStream[T any](rc io.ReadCloser, factory StreamFactory[T], fn func(T) bool) (err error)
- func ReadStreamChan[T any](rc io.ReadCloser, factory StreamFactory[T], out chan<- T) (err error)
- func S2B(s string) []byte
- func StrIsset(s string) bool
- type CSVStream
- type Call
- func (c *Call[T]) Assert(fn func(req Response) error) *Call[T]
- func (c *Call[T]) BasicAuth(user, pass string) *Call[T]
- func (c *Call[T]) Body(payload any) *Call[T]
- func (c *Call[T]) BodyStream(rc io.ReadWriteCloser, bodySize int) *Call[T]
- func (c *Call[T]) Call(ctx context.Context) (err error)
- func (c *Call[T]) CallEndpoint(ctx context.Context, e *Endpoint) (err error)
- func (c *Call[T]) ContentLength(length int) *Call[T]
- func (c *Call[T]) ContentType(ct string) *Call[T]
- func (c *Call[T]) ExpectedStatusCodes(states ...int) *Call[T]
- func (c *Call[T]) Header(key, value string, override bool) *Call[T]
- func (c *Call[T]) HeaderFunc(fn func() (key, value string, override bool)) *Call[T]
- func (c *Call[T]) IgnoreResponseBody() *Call[T]
- func (c *Call[T]) Log(w io.Writer)
- func (c *Call[T]) Method(method string) *Call[T]
- func (c *Call[T]) ParseCSV(ignoreLines int, parser csvparser.Parser[T], fn func(T) bool) *Call[T]
- func (c *Call[T]) ParseJSON() *Call[T]
- func (c *Call[T]) ParseJSONEachRow(fn func(T) bool) *Call[T]
- func (c *Call[T]) ParseJSONEachRowChan(out chan<- T) *Call[T]
- func (c *Call[T]) ParseStream(factory StreamFactory[T], fn func(T) bool) *Call[T]
- func (c *Call[T]) ParseStreamChan(factory StreamFactory[T], ch chan<- T) *Call[T]
- func (c *Call[T]) Query(k, v string) *Call[T]
- func (c *Call[T]) RawBody(payload []byte) *Call[T]
- func (c *Call[T]) ReadBody() *Call[T]
- func (c *Call[T]) Request(opts ...ReqOption) *Call[T]
- func (c *Call[T]) RequestSniffed(fn func([]byte, error)) *Call[T]
- func (c *Call[T]) RequestStreamBody(opt StreamCallReqOptionFunc[T]) *Call[T]
- func (c *Call[T]) Response(opts ...ResOption) *Call[T]
- func (c *Call[T]) URI(raw string) *Call[T]
- func (c *Call[T]) URL(raw string) *Call[T]
- func (c *Call[T]) WithLogger(l logger) *Call[T]
- type CallReqOption
- type CallReqOptionFunc
- func BasicAuth[T any](user, pass string) CallReqOptionFunc[T]
- func Body[T any](payload any) CallReqOptionFunc[T]
- func BodyStream[T any](rc io.ReadWriteCloser, bodySize int) CallReqOptionFunc[T]
- func ContentType[T any](ct string) CallReqOptionFunc[T]
- func Header[T any](k, v string, override bool) CallReqOptionFunc[T]
- func HeaderFunc[T any](fn func() (string, string, bool)) CallReqOptionFunc[T]
- func Method[T any](method string) CallReqOptionFunc[T]
- func Query[T any](k, v string) CallReqOptionFunc[T]
- func RawBody[T any](payload []byte) CallReqOptionFunc[T]
- func RequestSniffer[T any](fn func([]byte, error)) CallReqOptionFunc[T]
- func URI[T any](raw string) CallReqOptionFunc[T]
- func URL[T any](raw string) CallReqOptionFunc[T]
- type CallResOption
- type CallResOptionFunc
- func Assertion[T any](fn func(res Response) error) CallResOptionFunc[T]
- func CloseBody[T any]() CallResOptionFunc[T]
- func ExpectedStatusCodes[T any](states ...int) CallResOptionFunc[T]
- func IgnoredBody[T any]() CallResOptionFunc[T]
- func ParseBodyRaw[T any]() CallResOptionFunc[T]
- func ParseJSON[T any]() CallResOptionFunc[T]
- func ParseStream[T any](factory StreamFactory[T], fn func(T) bool) CallResOptionFunc[T]
- func ParseStreamChan[T any](factory StreamFactory[T], out chan<- T) CallResOptionFunc[T]
- type Channel
- type Client
- type Endpoint
- type FastHttpHttpClientAdapter
- type JSONEachRowStream
- type MockEndpoint
- type MockHttpClientAdapter
- type NativeHttpClientAdapter
- type NewLineStream
- type ProxyStream
- type ReqOption
- type ReqOptionFunc
- type Request
- type ResOption
- type ResOptionFunc
- type Response
- type Slice
- type Stream
- type StreamCallReqOption
- type StreamCallReqOptionFunc
- type StreamFactory
- type StreamFactoryFunc
- type StreamFromReader
Examples ¶
Constants ¶
This section is empty.
Variables ¶
var ( ContentTypeJSON string = "application/json" ContentTypeJSONEachRow string = "application/jsoneachrow" )
var ( ErrAssertion = errors.New("assertion was unmet") ErrUnexpectedStatusCode = errors.Wrap(ErrAssertion, "unexpected status code") ErrInsufficientParams = errors.New("insufficient params") )
var (
ErrUnknownContentType = errors.New("unknown content type")
)
Functions ¶
func BytesEquals ¶ added in v0.3.0
func CreateAuthorizationHeader ¶ added in v0.5.0
func EncodeBody ¶ added in v0.2.0
func EncodeStream ¶ added in v0.3.0
func ReadStream ¶
func ReadStream[T any](rc io.ReadCloser, factory StreamFactory[T], fn func(T) bool) (err error)
func ReadStreamChan ¶
func ReadStreamChan[T any](rc io.ReadCloser, factory StreamFactory[T], out chan<- T) (err error)
Types ¶
type CSVStream ¶ added in v0.6.0
type CSVStream[T any] struct { // contains filtered or unexported fields }
type Call ¶
type Call[T any] struct { Req Request Res Response BodyRaw []byte BodyParsed T ReqContentType string ReqBodyRaw []byte ReqIsStream bool ReqStreamWriter func(ctx context.Context, c *Call[T], res Request, wg *sync.WaitGroup) error ReqStreamSniffer func([]byte, error) ReqShouldSniff bool // contains filtered or unexported fields }
func (*Call[T]) BodyStream ¶ added in v0.8.0
func (c *Call[T]) BodyStream(rc io.ReadWriteCloser, bodySize int) *Call[T]
BodyStream receives a stream of data to set on the request. Second parameter `bodySize` indicates the estimated content-length of this stream. Required when employing fasthttp http client.
func (*Call[T]) CallEndpoint ¶ added in v0.2.0
func (*Call[T]) ContentLength ¶ added in v0.8.0
func (c *Call[T]) ContentLength(length int) *Call[T]
func (*Call[T]) ContentType ¶ added in v0.8.0
func (c *Call[T]) ContentType(ct string) *Call[T]
func (*Call[T]) ExpectedStatusCodes ¶ added in v0.8.0
func (c *Call[T]) ExpectedStatusCodes(states ...int) *Call[T]
func (*Call[T]) HeaderFunc ¶ added in v0.8.0
func (*Call[T]) IgnoreResponseBody ¶ added in v0.8.0
func (c *Call[T]) IgnoreResponseBody() *Call[T]
func (*Call[T]) ParseJSONEachRow ¶ added in v0.8.0
func (c *Call[T]) ParseJSONEachRow(fn func(T) bool) *Call[T]
func (*Call[T]) ParseJSONEachRowChan ¶ added in v0.8.0
func (c *Call[T]) ParseJSONEachRowChan(out chan<- T) *Call[T]
func (*Call[T]) ParseStream ¶ added in v0.8.0
func (c *Call[T]) ParseStream(factory StreamFactory[T], fn func(T) bool) *Call[T]
func (*Call[T]) ParseStreamChan ¶ added in v0.8.0
func (c *Call[T]) ParseStreamChan(factory StreamFactory[T], ch chan<- T) *Call[T]
func (*Call[T]) RequestSniffed ¶ added in v0.8.0
func (*Call[T]) RequestStreamBody ¶ added in v0.8.0
func (c *Call[T]) RequestStreamBody(opt StreamCallReqOptionFunc[T]) *Call[T]
func (*Call[T]) WithLogger ¶ added in v0.7.0
func (c *Call[T]) WithLogger(l logger) *Call[T]
type CallReqOption ¶ added in v0.3.0
type CallReqOptionFunc ¶ added in v0.2.0
func BodyStream ¶ added in v0.8.0
func BodyStream[T any](rc io.ReadWriteCloser, bodySize int) CallReqOptionFunc[T]
func ContentType ¶ added in v0.2.0
func HeaderFunc ¶ added in v0.8.0
func RequestSniffer ¶ added in v0.8.0
type CallResOption ¶
type CallResOptionFunc ¶
func ExpectedStatusCodes ¶ added in v0.8.0
func IgnoredBody ¶ added in v0.8.0
func IgnoredBody[T any]() CallResOptionFunc[T]
func ParseBodyRaw ¶ added in v0.8.0
func ParseBodyRaw[T any]() CallResOptionFunc[T]
func ParseStream ¶ added in v0.8.0
func ParseStreamChan ¶ added in v0.8.0
func ParseStreamChan[T any](factory StreamFactory[T], out chan<- T) CallResOptionFunc[T]
type Endpoint ¶
type Endpoint struct {
// contains filtered or unexported fields
}
func NewEndpoint ¶
type FastHttpHttpClientAdapter ¶
type FastHttpHttpClientAdapter struct {
// contains filtered or unexported fields
}
func Fasthttp ¶ added in v0.8.0
func Fasthttp() *FastHttpHttpClientAdapter
func FasthttpClient ¶ added in v0.8.0
func FasthttpClient(cli *fasthttp.Client) *FastHttpHttpClientAdapter
type JSONEachRowStream ¶
type JSONEachRowStream[T any] struct { // contains filtered or unexported fields }
func (*JSONEachRowStream[T]) Data ¶
func (s *JSONEachRowStream[T]) Data() T
func (*JSONEachRowStream[T]) Err ¶
func (s *JSONEachRowStream[T]) Err() error
type MockEndpoint ¶
type MockEndpoint struct{}
type MockHttpClientAdapter ¶
type MockHttpClientAdapter struct{}
func NewMockHttpClientAdapter ¶
func NewMockHttpClientAdapter() *MockHttpClientAdapter
type NativeHttpClientAdapter ¶
type NativeHttpClientAdapter struct {
// contains filtered or unexported fields
}
func NetHttp ¶ added in v0.8.0
func NetHttp() *NativeHttpClientAdapter
func NetHttpClient ¶ added in v0.8.0
func NetHttpClient(cli *http.Client) *NativeHttpClientAdapter
type NewLineStream ¶ added in v0.4.0
type NewLineStream struct {
// contains filtered or unexported fields
}
type ProxyStream ¶ added in v0.4.0
type ProxyStream struct {
// contains filtered or unexported fields
}
type ReqOptionFunc ¶
func (ReqOptionFunc) Configure ¶
func (f ReqOptionFunc) Configure(req Request) error
type Request ¶
type Request interface {
Method() string
SetMethod(string)
SetURL(*url.URL)
// SetBodyStream sets the stream of body data belonging to a request. bodySize parameter is needed
// when using fasthttp implementation.
SetBodyStream(rc io.ReadWriteCloser, bodySize int)
SetBody([]byte)
Body() []byte
BodyStream() io.ReadWriteCloser
URL() *url.URL
// contains filtered or unexported methods
}
type ResOptionFunc ¶
func (ResOptionFunc) Parse ¶
func (f ResOptionFunc) Parse(res Response) error
type Response ¶
type Response interface {
Status() int
StatusText() string
Body() io.ReadCloser
SetBody(rc io.ReadCloser)
SetStatus(status int)
// contains filtered or unexported methods
}
type Stream ¶
func NewCSVStream ¶ added in v0.6.0
type StreamCallReqOption ¶ added in v0.3.0
type StreamCallReqOption[T any] interface { CallReqOption[T] // contains filtered or unexported methods }
type StreamCallReqOptionFunc ¶ added in v0.3.0
func RequestStreamBody ¶ added in v0.8.0
func RequestStreamBody[T, U any](r rangeable[U]) StreamCallReqOptionFunc[T]
type StreamFactory ¶
func NewCSVStreamFactory ¶ added in v0.6.0
func NewJSONEachRowStreamFactory ¶
func NewJSONEachRowStreamFactory[T any]() StreamFactory[T]
func NewNewLineStreamFactory ¶ added in v0.4.0
func NewNewLineStreamFactory() StreamFactory[[]byte]