fusenapi/utils/curl/client_resty.go
2023-08-28 10:25:47 +08:00

164 lines
5.0 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package curl
import (
"bytes"
"context"
"fmt"
"time"
"github.com/go-resty/resty/v2"
"github.com/zeromicro/go-zero/core/logc"
"github.com/zeromicro/go-zero/core/logx"
"github.com/zeromicro/go-zero/core/trace"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/propagation"
oteltrace "go.opentelemetry.io/otel/trace"
)
func NewClient(ctx context.Context, c *Config) Client {
// 创建一个restry客户端
client := resty.New().SetBaseURL(c.BaseUrl)
// 设置超时时间为 5 分钟
client.SetTimeout(5 * time.Minute)
/* 传输链路 */
tracer := otel.GetTracerProvider().Tracer(trace.TraceName)
spanCtx, span := tracer.Start(
ctx,
"client_resty_send",
oteltrace.WithSpanKind(oteltrace.SpanKindClient),
)
carrier := &propagation.HeaderCarrier{}
otel.GetTextMapPropagator().Inject(spanCtx, carrier)
for _, cacarrierKey := range carrier.Keys() {
client.SetHeader(cacarrierKey, carrier.Get(cacarrierKey))
}
defer span.End()
/* 传输链路 */
if c.HeaderData != nil {
for k, v := range c.HeaderData {
client = client.SetHeader(k, v)
}
}
if c.RetryCount > 0 {
client = client.SetRetryCount(int(c.RetryCount))
}
if c.RetryWaitTime > 0 {
client = client.SetRetryWaitTime(time.Duration(c.RetryWaitTime) * time.Second)
}
return &defaultClient{
client: client,
c: c,
ctx: ctx,
}
}
type (
Config struct {
BaseUrl string `json:"base_url"`
Url string `json:"url"`
HeaderData map[string]string `json:"header_data"`
RetryCount int64 `json:"retry_count"`
RetryWaitTime int64 `json:"retry_wait_time"`
}
defaultClient struct {
c *Config
client *resty.Client
ctx context.Context
}
Client = interface {
// PostJson请求
PostJson(jsonData interface{}, res interface{}) error
// PostForm请求
PostForm(formData map[string]string, res interface{}) (interface{}, error)
// 上传文件
PostFile(fileParam string, fileName string, res interface{}, profileBytes []byte, formData map[string]string) (interface{}, error)
}
)
// PostJson请求
func (c *defaultClient) PostJson(jsonData interface{}, res interface{}) error {
//logc.Infof(c.ctx, "客户端名称 Client PostJson jsonData:%+v", jsonData)
logc.Infof(c.ctx, "客户端名称 请求开始时间:%+v", time.Now().UTC())
resp, err := c.client.
SetHeader("Accept", "application/json").
SetHeader("Content-Type", "application/json").
R().
SetContext(c.ctx).
SetResult(res).
SetBody(jsonData).
Post(c.c.Url)
if err != nil {
logc.Errorf(c.ctx, "客户端 请求失败 Client PostForm error:%+v", err)
return err
}
logc.Infof(c.ctx, "客户端名称 请求结束时间:%+v", time.Now().UTC())
logc.Infof(c.ctx, "客户端 请求返回结果 Client PostForm RawResponse result:%+v,%+V", resp.RawResponse.Status, resp.RawResponse.StatusCode)
//logc.Infof(c.ctx, "客户端 请求返回结果 Client PostForm res result:%+v", res)
if resp.StatusCode() != 200 {
err = fmt.Errorf("服务端失败,返回结果:%+v", resp.RawResponse.Status)
logx.Errorf("客户端 请求失败 Client PostForm Server error:%+v", err)
}
return err
}
// PostForm请求
func (c *defaultClient) PostForm(formData map[string]string, res interface{}) (interface{}, error) {
resp, err := c.client.
SetHeader("Accept", "application/json").
SetHeader("Content-Type", "multipart/form-data").
R().
SetContext(c.ctx).
SetResult(res).
SetFormData(formData).
Post(c.c.Url)
if err != nil {
logc.Errorf(c.ctx, "客户端 请求失败 Client PostForm error:%+v", err)
return res, err
}
logc.Infof(c.ctx, "客户端 请求返回结果 Client PostForm RawResponse result:%+v,%+V", resp.RawResponse.Status, resp.RawResponse.StatusCode)
logc.Infof(c.ctx, "客户端 请求返回结果 Client PostForm res result:%+v", res)
if resp.StatusCode() != 200 {
err = fmt.Errorf("服务端失败,返回结果:%+v", resp.RawResponse.Status)
logx.Errorf("客户端 请求失败 Client PostForm Server error:%+v", err)
}
return res, err
}
// 上传文件
func (c *defaultClient) PostFile(fileParam string, fileName string, res interface{}, profileBytes []byte, formData map[string]string) (interface{}, error) {
resp, err := c.client.
SetHeader("Accept", "application/json").
SetHeader("Content-Type", "multipart/form-data").
R().
SetContext(c.ctx).
SetResult(res).
SetFileReader(fileParam, fileName, bytes.NewReader(profileBytes)).
SetFormData(formData).
Post(c.c.Url)
if err != nil {
logc.Errorf(c.ctx, "客户端 请求失败 Client PostFile error:%+v", err)
return res, err
}
logc.Infof(c.ctx, "客户端 请求返回结果 Client PostFile RawResponse result:%+v,%+V", resp.RawResponse.Status, resp.RawResponse.StatusCode)
logc.Infof(c.ctx, "客户端 请求返回结果 Client PostFile res result:%+v", res)
if resp.StatusCode() != 200 {
err = fmt.Errorf("服务端失败返回结果%+v", resp.RawResponse.Status)
logx.Errorf("客户端 请求失败 Client PostFile Server error:%+v", err)
}
return res, err
}