application.go 2.1 KB

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