Dmitry Telenkov 13 hours ago
parent
commit
0492ac47ed
3 changed files with 201 additions and 0 deletions
  1. 36 0
      go/stepik/4/server1.go
  2. 92 0
      go/stepik/4/server2.go
  3. 73 0
      go/stepik/4/server_task.go

+ 36 - 0
go/stepik/4/server1.go

@@ -23,3 +23,39 @@ func main() {
 		fmt.Println("Ошибка запуска сервера:", err)
 	}
 }
+
+func handleRequest(w http.ResponseWriter, r *http.Request) {
+	// В зависимости от метода HTTP-запроса вызываем соответствующий обработчик
+	switch r.Method {
+	case http.MethodGet:
+		handleGET(w, r)
+	case http.MethodPost:
+		handlePOST(w, r)
+	case http.MethodPut:
+		handlePUT(w, r)
+	case http.MethodDelete:
+		handleDELETE(w, r)
+	default:
+		http.Error(w, "Метод не поддерживается", http.StatusMethodNotAllowed)
+	}
+}
+
+// Обработчик для GET-запросов
+func handleGET(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintln(w, "Это GET-запрос!")
+}
+
+// Обработчик для POST-запросов
+func handlePOST(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintln(w, "Это POST-запрос!")
+}
+
+// Обработчик для PUT-запросов
+func handlePUT(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintln(w, "Это PUT-запрос!")
+}
+
+// Обработчик для DELETE-запросов
+func handleDELETE(w http.ResponseWriter, r *http.Request) {
+	fmt.Fprintln(w, "Это DELETE-запрос!")
+}

+ 92 - 0
go/stepik/4/server2.go

@@ -0,0 +1,92 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"log"
+	"net/http"
+)
+
+// Обработчик HTTP-запросов
+/*
+func handler(w http.ResponseWriter, r *http.Request) {
+	fmt.Println("RawQuery: ", r.URL.String())
+	fmt.Println("Name: ", r.URL.Query().Get("name"))
+	fmt.Println("IsExist: ", r.URL.Query().Has("name"))
+	w.Write([]byte("Привет, Stepik!"))
+}
+*/
+
+func main() {
+
+	// server2()
+	server3()
+	/*
+		// Регистрируем обработчик для пути "/"
+		http.HandleFunc("/", handler)
+
+		// Запускаем веб-сервер на порту 8080
+		err := http.ListenAndServe(":8080", nil)
+		if err != nil {
+			fmt.Println("Ошибка запуска сервера:", err)
+		}
+	*/
+}
+
+// Веб сервер по пути /body принимает запрос и проверяет что он
+// является POST методом. Далее читаем тело через уже знакомую
+// функцию io.ReadAll()
+
+func handlerBody(w http.ResponseWriter, r *http.Request) {
+	// Проверяем что метод POST
+	if r.Method == "POST" {
+		// читаем входящее тело запроса
+		bytesBody, err := io.ReadAll(r.Body)
+		if err != nil {
+			log.Println(err)
+			w.Write([]byte("Плохое тело запроса"))
+			return
+		}
+		// печатем тело запроса как строку
+		fmt.Println(string(bytesBody))
+		// отвечаем клиенту, что все хорошо
+		w.Write([]byte("OK!"))
+		return
+	}
+	w.Write([]byte("Разрешен только метод POST!"))
+}
+
+func server2() {
+	// Регистрируем обработчик для пути "/body"
+	http.HandleFunc("/body", handlerBody)
+	// Запускаем веи-сервер на порту 8080
+	err := http.ListenAndServe(":8080", nil)
+	if err != nil {
+		fmt.Println("Ошибка запуска сервера:", err)
+	}
+}
+
+// Коды ответа
+
+func handlerOK1(w http.ResponseWriter, r *http.Request) {
+	w.Write([]byte("Привет"))
+	w.WriteHeader(200)
+}
+
+func handlerOK2(w http.ResponseWriter, r *http.Request) {
+	if r.Method == "PUT" {
+		w.WriteHeader(http.StatusMethodNotAllowed) // return 405
+		return
+	}
+	w.Write([]byte("Привет!"))
+	w.WriteHeader(http.StatusOK)
+}
+
+func server3() {
+	http.HandleFunc("/", handlerOK1)
+	http.HandleFunc("2", handlerOK2)
+	err := http.ListenAndServe(":3000", nil)
+	if err != nil {
+		fmt.Println("Ошибка запуска сервера:", err)
+	}
+}

+ 73 - 0
go/stepik/4/server_task.go

@@ -0,0 +1,73 @@
+package main
+
+import (
+	"fmt"
+	"net/http"
+	"strconv"
+)
+
+func main() {
+	// server1()
+	// server2()
+	server3()
+}
+
+func handlerHello(w http.ResponseWriter, r *http.Request) {
+	w.Write([]byte("Hello, web!"))
+}
+
+func server1() {
+	http.HandleFunc("/get", handlerHello)
+
+	err := http.ListenAndServe(":8080", nil)
+	if err != nil {
+		fmt.Println("Ошибка запуска сервера:", err)
+	}
+
+}
+
+func handlerName(w http.ResponseWriter, r *http.Request) {
+	w.Write([]byte("Hello," + r.URL.Query().Get("name")))
+}
+
+func server2() {
+	http.HandleFunc("/api/user", handlerName)
+
+	err := http.ListenAndServe(":9000", nil)
+	if err != nil {
+		fmt.Println("Ошибка запуска сервера:", err)
+	}
+}
+
+// Напиши веб сервер (порт :3333) - счетчик который будет обрабатывать
+// GET (/count) и POST (/count) запросы:
+// GET:  возвращает счетчик
+// POST: увеличивает ваш счетчик на значение  (с ключом "count")
+// которое вы получаете из формы, но если пришло НЕ число то нужно
+// ответить клиенту: "это не число" со статусом http.StatusBadRequest (400).
+
+var count int
+
+func handlerCount(w http.ResponseWriter, r *http.Request) {
+	if r.Method == "GET" {
+		fmt.Fprint(w, count)
+	} else if r.Method == "POST" {
+		cnt, err := strconv.Atoi(r.FormValue("count"))
+		if err != nil {
+			w.WriteHeader(http.StatusBadRequest) // return 400
+			w.Write([]byte("это не число"))
+			return
+		}
+		count += cnt
+	}
+	w.WriteHeader(http.StatusMethodNotAllowed) // return 405
+}
+
+func server3() {
+	http.HandleFunc("/count", handlerCount)
+
+	err := http.ListenAndServe(":3333", nil)
+	if err != nil {
+		fmt.Println("Ошибка запуска сервера:", err)
+	}
+}