mirror of
https://github.com/laoxong/nofx.git
synced 2026-06-04 09:58:22 +08:00
7baa07738a
- implement VisualScreener Rank - implement More Instrument Agg Rank - rank interface can help user to choose a coin
97 lines
2.2 KiB
Go
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,
|
|
}
|