application.go 2.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. package example_test
  2. import (
  3. "context"
  4. "log"
  5. "sync"
  6. "sync/atomic"
  7. "time"
  8. "git.ali33.ru/fcg-xvii/rest"
  9. "git.ali33.ru/fcg-xvii/rest/rest_http"
  10. )
  11. // ExapmleApp реализует интерфейс IApplication, который отдает серверу параметры подключения,
  12. // секретный ключ шифрования токена авторизации,
  13. // а так же обрабатывает поступающие запросы
  14. type ExampleApp struct {
  15. addr string
  16. secret []byte
  17. users *sync.Map
  18. groups *sync.Map
  19. idCounter int64
  20. }
  21. func (s *ExampleApp) GenerateID() int64 {
  22. id := atomic.AddInt64(&s.idCounter, 1)
  23. return id
  24. }
  25. func (s *ExampleApp) Addr() string {
  26. return s.addr
  27. }
  28. func (s *ExampleApp) Secret() []byte {
  29. return s.secret
  30. }
  31. func (s *ExampleApp) Executer(r rest.IRequestIn) (rest.IExecuter, bool) {
  32. switch r.RCommand() {
  33. case "/user/register":
  34. return &ExampleRequestRegister{}, true
  35. case "/user/info":
  36. return &ExampleRequestUserInfo{}, true
  37. case "/user/set_avatar":
  38. return &ExampleRequestSetAvatar{}, true
  39. default:
  40. return nil, false
  41. }
  42. }
  43. var App *ExampleApp
  44. // ExampleNew показывает пример создания и запуска сервера с RestAPI
  45. func ExampleNew() {
  46. // создаем новый сервер с использованием приложения ExampleApp
  47. App = &ExampleApp{
  48. addr: "localhost:8080",
  49. secret: []byte("top-secret"),
  50. users: new(sync.Map),
  51. groups: new(sync.Map),
  52. idCounter: 0,
  53. }
  54. // Добавляем публичную группу
  55. groupID := App.GenerateID()
  56. App.groups.Store(
  57. groupID,
  58. &ExampleGroup{
  59. ID: groupID,
  60. Name: "public",
  61. },
  62. )
  63. // создаем сервер
  64. server := rest.NewServer("localhost:8080", []byte("top-secret"))
  65. restServ := rest_http.New(App, App, nil)
  66. restServ.Prepare(server, "/")
  67. // пробуем запустить его. Если через секунду запуск не удался, будет возвращена ошибка
  68. if err := server.Listen(time.Second, context.Background()); err != nil {
  69. // ошибка запуска
  70. log.Fatal(err)
  71. }
  72. }