Documentation
¶
Overview ¶
Package apiclient - пакет API клиента для использования в сервисах (для возможности вызова service to service)
Включает в себя автоматическое обновление jwt токенов через сервис авторизации
Index ¶
- Constants
- Variables
- type ConnectionInfo
- type HttpClient
- type HttpMessage
- type HttpMessageHandler
- type WsClient
- func (c *WsClient) IsAlive() bool
- func (c *WsClient) SendMessage(connInd int, msg WsMessage, handler WsMessageHandler) error
- func (c *WsClient) SendMessageWithResponse(connInd int, msg WsMessage) (WsMessage, error)
- func (c *WsClient) Start() error
- func (c *WsClient) Stop() error
- func (c *WsClient) Sub(connInd int, kind structs.SubKind, req WsMessage, handler WsMessageHandler) error
- type WsMessage
- type WsMessageHandler
- type WsMessageKind
- type WsMsgParser
- type WsSubHandler
Examples ¶
Constants ¶
const ( MessageKindAuth = WsMessageKind(iota) // MessageKindAuth - ответ на запрос авторизации MessageKindSub // MessageKindSub - сообщение по подписке MessageKindResponse // MessageKindResponse - ответ на произвольный запрос )
Variables ¶
var ( AddressRequiredErr = errors.New("address required") // AddressRequiredErr - пустой адрес ConnIndexOutOfRangeErr = errors.New("conn ind out of range") // ConnIndexOutOfRangeErr - в клиенте нет соединения с таким индексом UnhandledMessageErr = errors.New("unhandled message") // UnhandledMessageErr - для какого-то из сообщений не нашлось обработчика )
var (
RefreshFuncIsRequired = errors.New("refresh function is required")
)
Functions ¶
This section is empty.
Types ¶
type ConnectionInfo ¶
type ConnectionInfo struct {
Address string // Address - адрес для подключения
ConnOptions *opts.ClientPrivateConnOptions // ConnOptions - опции подключения
SubHandler WsSubHandler // SubHandler - обработчик любого сообщения по подписке
// contains filtered or unexported fields
}
ConnectionInfo - данные соединения
type HttpClient ¶
type HttpClient struct {
// contains filtered or unexported fields
}
HttpClient - клиент для вызовов с помощью http-запросов
func NewHttpClient ¶
func NewHttpClient(baseUrl string, accessToken string, accessExpiresAt int64, refreshToken string, refreshExpiresAt int64, fillVersion func(http.Header), refresh refreshFunc, notifier errorNotifier) (*HttpClient, error)
NewHttpClient - функция создания http клиента
func (*HttpClient) MakeRequest ¶
func (c *HttpClient) MakeRequest(ctx context.Context, msg *HttpMessage, handler HttpMessageHandler)
Example ¶
package main
import (
"context"
"github.com/custom-app/sdk-go/service/apiclient"
"log"
"net/http"
)
func main() {
client, err := apiclient.NewHttpClient("https://host:port", "access token", 23513,
"refresh token", 263216, func(header http.Header) {
// добавление версии в заголовки запроса
}, func(ctx context.Context, token string) (string, int64, string, int64, error) {
// код получения новых токенов, как правило, http запрос в сервис авторизации с refresh токенов
return "", 0, "", 0, nil
}, func(err error) {
// код работы с ошибкой (логирование, отправка в тг чат багов)
})
if err != nil {
log.Panicln(err)
}
if err := client.Start(); err != nil {
log.Panicln(err)
}
client.MakeRequest(context.Background(), nil,
func(msg []byte) (needRetry bool, err error) {
// парсинг сообщения, получение нужной информации
//
// при необходимости можно повторить попытку отправки запроса
return false, nil
})
}
func (*HttpClient) MakeRequestWithResponse ¶ added in v0.0.43
func (c *HttpClient) MakeRequestWithResponse(ctx context.Context, msg *HttpMessage) ([]byte, error)
func (*HttpClient) Start ¶
func (c *HttpClient) Start() error
func (*HttpClient) Stop ¶
func (c *HttpClient) Stop() error
type HttpMessage ¶
type HttpMessage struct {
Message proto.Message // сообщение
Url string // часть адреса(path), то есть протокол и хост сюда не включены
}
HttpMessage - сообщение для отправки другому сервису
type HttpMessageHandler ¶
HttpMessageHandler - сигнатура функции обработки ответа на http запрос
type WsClient ¶
type WsClient struct {
// contains filtered or unexported fields
}
WsClient - клиент для отправки сообщения по WebSocket
func NewWsClient ¶
func NewWsClient(connections []*ConnectionInfo, accessToken string, accessExpiresAt int64, refreshToken string, refreshExpiresAt int64, refresh refreshFunc, notifier errorNotifier, msgParser WsMsgParser) (*WsClient, error)
func (*WsClient) SendMessage ¶
func (c *WsClient) SendMessage(connInd int, msg WsMessage, handler WsMessageHandler) error
Example ¶
package main
import (
"context"
"github.com/custom-app/sdk-go/service/apiclient"
"github.com/custom-app/sdk-go/service/wsservice/opts"
"google.golang.org/protobuf/proto"
"log"
)
func main() {
client, err := apiclient.NewWsClient([]*apiclient.ConnectionInfo{
{
Address: "ws://localhost:1337/connect",
ConnOptions: &opts.ClientPrivateConnOptions{}, // подробно останавливаться не буду
SubHandler: func(msg proto.Message) (err error) {
// обработка сообщения по подписке
return nil
},
},
}, "access token", 236135, "refresh token", 3612623,
func(ctx context.Context, token string) (string, int64, string, int64, error) {
// код получения новых токенов, как правило, http запрос в сервис авторизации с refresh токенов
return "", 0, "", 0, nil
}, func(err error) {
// код работы с ошибкой (логирование, отправка в тг чат багов)
}, func(bytes []byte) (apiclient.WsMessageKind, apiclient.WsMessage, error) {
var res proto.Message // в реальности здесь Request
if err := proto.Unmarshal(bytes, res); err != nil {
return 0, nil, err
}
// определяем тип сообщения по распаршенному прото и возвращаем
return 0, nil, nil
})
if err != nil {
log.Panicln(err)
}
if err := client.Start(); err != nil {
log.Panicln(err)
}
if err := client.SendMessage(0, nil, func(msg proto.Message) (needRetry bool, err error) {
// обработка ответа на запрос
//
// может быть необходимо получить какие-то данные из ответа
//
// при возврате needRetry == true запрос будет переотправлен
return false, nil
}); err != nil {
log.Panicln(err)
}
}
func (*WsClient) SendMessageWithResponse ¶ added in v0.0.43
type WsMessage ¶
WsMessage - сообщения для отправки по WS, обязательна возможность получения/присваивания id запроса
Если в прото сообщении сделать поле id, то функция GetId сгенерится сама, а вот функцию SetId надо добавить самостоятельно, это можно сделать с помощью объявления нового типа, в который будет встроен(embedding) тип запроса
type WsMessageHandler ¶
WsMessageHandler - сигнатура функции обработчика ws-сообщения
type WsMessageKind ¶
type WsMessageKind int
WsMessageKind - вспомогательный тип для определения типа сообщения
type WsMsgParser ¶
type WsMsgParser func([]byte) (WsMessageKind, WsMessage, error)
WsMsgParser - сигнатура функции парсинга сообщения
type WsSubHandler ¶
WsSubHandler - сигнатура функции обработчика ws-сообщения по подписке. Отличие в том, что здесь нет такого понятия как retry