Files
wqqqqqq 7baa07738a feat: implement coinank openapi rank interface (#1250)
- implement VisualScreener Rank
- implement More Instrument Agg Rank
- rank interface can help user to choose a coin
2025-12-20 01:12:50 +08:00

97 lines
2.2 KiB
Go

package coinank
import (
"bytes"
"context"
"encoding/json"
"errors"
"fmt"
"io"
"net/http"
"net/url"
"time"
)
// CoinankClient coinank openapi url and apikey
type CoinankClient struct {
Url string
Apikey string
}
// CoinankResponse coinank openapi common response
type CoinankResponse[T any] struct {
Success bool `json:"success"`
Code string `json:"code"`
Data T `json:"data"`
}
// PageData coinank openapi pageData in response
type PageData[T any] struct {
List []T `json:"list"`
Pagination struct {
Current int `json:"current"`
Total int `json:"total"`
PageSize int `json:"pageSize"`
} `json:"pagination"`
}
var HttpError error = errors.New("http client error")
// NewCoinankClient new coinank http client for coinank openapi
func NewCoinankClient(url, apikey string) *CoinankClient {
return &CoinankClient{url, apikey}
}
// Get coinank openapi get request
func (c *CoinankClient) Get(ctx context.Context, path string, paramsMap map[string]string) (string, error) {
data := url.Values{}
for key, value := range paramsMap {
data.Add(key, value)
}
fullURL := fmt.Sprintf("%s%s?%s", c.Url, path, data.Encode())
request, err := http.NewRequestWithContext(ctx, "GET", fullURL, nil)
if err != nil {
return "", err
}
request.Header.Add("apikey", c.Apikey)
resp, err := client.Do(request)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}
// Post coinank openapi post request
func (c *CoinankClient) Post(ctx context.Context, path string, data any) (string, error) {
fullURL := fmt.Sprintf("%s%s", c.Url, path)
postData, err := json.Marshal(data)
if err != nil {
return "", err
}
request, err := http.NewRequestWithContext(ctx, "POST", fullURL, bytes.NewBuffer(postData))
if err != nil {
return "", err
}
request.Header.Set("Content-Type", "application/json")
request.Header.Add("apikey", c.Apikey)
resp, err := client.Do(request)
if err != nil {
return "", err
}
defer resp.Body.Close()
body, err := io.ReadAll(resp.Body)
if err != nil {
return "", err
}
return string(body), nil
}
var client = &http.Client{
Timeout: 30 * time.Second,
}