Advertisement
Guest User

Untitled

a guest
Jul 14th, 2019
539
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Go 3.95 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4.     "context"
  5.     "encoding/json"
  6.     "flag"
  7.     "log"
  8.     "net/http"
  9.     "os"
  10.     "os/signal"
  11.     "path"
  12.     "syscall"
  13.  
  14.     "github.com/go-chi/chi"
  15. )
  16.  
  17. func main() {
  18.     ctx := context.Background()
  19.     // чтобы можно было подсовывать разнеые конфиги при запуске. Например, main.exe -c config-new.yaml
  20.     configPath := flag.String("c", "config.yaml", "set config path")
  21.     flag.Parse()
  22.  
  23.     // посмотри, что делает configure, это моя функция
  24.     cfg, err := configure(*configPath)
  25.     if err != nil {
  26.         log.Fatalf("Can't configure, cause %s", err)
  27.     }
  28.     // Создание роутера, который занимается перенаправлением в нужный хендлер, в зависимости от пути
  29.     r := chi.NewRouter()
  30.  
  31.     // curl -XGET localhost:8080/example/romik получишь в ответ Вонючий Ромик
  32.     r.Get(path.Join(cfg.Name, "romik"), func(w http.ResponseWriter, req *http.Request) {
  33.         log.Printf("Method = %s, URL = %s, Queries = %v", req.Method, req.URL.String(), req.URL.Query())
  34.         // записываем ответ в ResponseWriter
  35.         err := json.NewEncoder(w).Encode("Вонючий Ромик")
  36.         if err != nil {
  37.             log.Println(err)
  38.         }
  39.     })
  40.  
  41.     // curl -XGET localhost:8080/example/withname?name=romik, получишь в ответ romik
  42.     r.Get(path.Join(cfg.Name, "withname"), func(w http.ResponseWriter, req *http.Request) {
  43.         log.Printf("Method = %s, URL = %s, Queries = %v", req.Method, req.URL.String(), req.URL.Query())
  44.         name := req.URL.Query().Get("name")
  45.         if name == "" {
  46.             log.Println("name param is missing")
  47.             return
  48.         }
  49.         err := json.NewEncoder(w).Encode(name)
  50.         if err != nil {
  51.             log.Println(err)
  52.         }
  53.     })
  54.  
  55.     // curl -XGET localhost:8080/example/dynamic/romik получишь в ответ romik, /example/dynamic/nastya получишь в ответ nastya
  56.     r.Get(path.Join(cfg.Name, "dynamic/{name}"), func(w http.ResponseWriter, req *http.Request) {
  57.         log.Printf("Method = %s, URL = %s, Queries = %v", req.Method, req.URL.String(), req.URL.Query())
  58.         name := chi.URLParam(req, "name")
  59.         err := json.NewEncoder(w).Encode(name)
  60.         if err != nil {
  61.             log.Println(err)
  62.         }
  63.     })
  64.  
  65.     // curl -XPOST localhost:8080/example/post -d '{"name" : "romik"}' получишь в ответ romik
  66.     r.Post(path.Join(cfg.Name, "post"), func(w http.ResponseWriter, req *http.Request) {
  67.         log.Printf("Method = %s, URL = %s, Queries = %v", req.Method, req.URL.String(), req.URL.Query())
  68.         body := map[string]interface{}{}
  69.         // Парсим тело запроса (-d) в формате json в map[sting]interface{} (любой json можно представить в виде map[stroing]interface{})
  70.         if err := json.NewDecoder(req.Body).Decode(&body); err != nil {
  71.             log.Println(err)
  72.             return
  73.         }
  74.         name, ok := body["name"]
  75.         if !ok {
  76.             log.Println("name field is missing")
  77.             return
  78.         }
  79.         err = json.NewEncoder(w).Encode(name)
  80.         if err != nil {
  81.             log.Println(err)
  82.         }
  83.     })
  84.  
  85.     // Создание сервера, который и будет слушать на порту 8080, и перенаправлять на нужный хендрел с помощью r
  86.     server := &http.Server{
  87.         Addr:    cfg.ServerAddr,
  88.         Handler: r,
  89.     }
  90.  
  91.     go func() {
  92.         if err := server.ListenAndServe(); err != nil && err != http.ErrServerClosed {
  93.             log.Fatal(err)
  94.         }
  95.     }()
  96.  
  97.     log.Println("Start serving on", cfg.ServerAddr)
  98.     defer server.Shutdown(ctx)
  99.     // Прехватывание сигналов от операционной системы. Например, если ты нажмешь ctrl + c, то это будет syscall.SIGINT
  100.     sgnl := make(chan os.Signal, 1)
  101.     signal.Notify(sgnl,
  102.         syscall.SIGHUP,
  103.         syscall.SIGINT,
  104.         syscall.SIGTERM,
  105.         syscall.SIGQUIT)
  106.     // Ждем сигнала, чтобы не завершился сразу мейн
  107.     stop := <-sgnl
  108.     log.Printf("Server stop with signal %s", stop.String())
  109. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement