huobi_Golang icon indicating copy to clipboard operation
huobi_Golang copied to clipboard

support to use custom http client

Open choleraehyq opened this issue 4 years ago • 2 comments

Sometimes we need to use custom Transport or set Timeout.

choleraehyq avatar Oct 18 '20 03:10 choleraehyq

@choleraehyq do you have more concret example?

eynzhang avatar Feb 26 '21 10:02 eynzhang

For example instead of:

type MarketClient struct {
	publicUrlBuilder *requestbuilder.PublicUrlBuilder
}

// Initializer
func (p *MarketClient) Init(host string) *MarketClient {
	p.publicUrlBuilder = new(requestbuilder.PublicUrlBuilder).Init(host)
	return p
}

Use pattern 'Constructor' and pass HTTP client as interface argument:

type Requestor interface{
    Get(string) ([]byte, error)
    Post(string, map[string]string) ([]byte, error)
}
type MarketClient struct {
	publicUrlBuilder *requestbuilder.PublicUrlBuilder
        client Requestor
}


func NewMarket(host string, cli Requestor) *MarketClient {
	p.publicUrlBuilder = new(requestbuilder.PublicUrlBuilder).Init(host)
        p.client = cli
	return p
}

func (mc *MarketClient) GetLatestTrade(symbol string) (*market.TradeTick, error) {
	request := new(model.GetRequest).Init()
	request.AddParam("symbol", symbol)

	url := mc.publicUrlBuilder.Build("/market/trade", request)
	resp, err := mc.cli.Get(url)
	if err != nil {
		return nil, err
	}
        result := market.GetLatestTradeResponse{}
	err = json.Unmarshal(resp, &result)
	if err != nil {
		return nil, err
	}
	if result.Status == "ok" && result.Tick != nil {
		return result.Tick, nil
	}
	return nil, errors.New(resp)
}

filinvadim avatar Feb 28 '21 08:02 filinvadim