Dmitry Telenkov 1 өдөр өмнө
parent
commit
5fc47923bc

+ 129 - 0
go/stepik/4/net_http.go

@@ -0,0 +1,129 @@
+package main
+
+import (
+	"bytes"
+	"encoding/json"
+	"fmt"
+	"io"
+	"log"
+	"net/http"
+	"net/url"
+)
+
+// User - структура для представления объекта пользователя
+type User struct {
+	Name string `json:"name"`
+	ID   uint32 `json:"id"`
+}
+
+type Output struct {
+	JSON struct {
+		Name string `json:"name"`
+		ID   uint32 `json:"id"`
+	} `json:"json"`
+	URL string `json:"usr"`
+}
+
+func main() {
+	// foo1()
+	// postFormExample()
+	queryExample()
+}
+
+func foo1() {
+	// Создаем экземпляр структуры User
+	var u = User{
+		Name: "Alex",
+		ID:   1,
+	}
+
+	// Кодируем структуру User в JSON (байтовый срез)
+	bytesRepresentation, err := json.Marshal(u)
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	// Отправляем POST-запрос на сервер с JSON-телом
+	resp, err := http.Post("https://httpbin.org/post", "application/json", bytes.NewBuffer(bytesRepresentation))
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	// Читаем и конвертируем тело ответа в байты
+	bytesResp, err := io.ReadAll(resp.Body)
+	if err != nil {
+		log.Println(err)
+		return
+	}
+
+	// Выводим содержимое тела ответа
+	// fmt.Println(string(bytesResp))
+
+	// Создаем экземпляр ответа сервера
+	var out Output
+	// Декодируем данные в формате JSON и заполняем структуру
+	err = json.Unmarshal(bytesResp, &out)
+	if err != nil {
+		log.Println(err)
+		return
+	}
+
+	fmt.Printf("%+v\n", out)
+	fmt.Println(out.URL)
+
+	/*
+	   var st string
+
+	   json.Unmarshal(bytesRepresentation, &st)
+
+	   fmt.Println(st)
+	*/
+}
+
+// Отправка данных в виде формы
+func postFormExample() {
+	formData := url.Values{
+		"name":     {"hello"},
+		"surename": {"golang post form"},
+	}
+
+	resp, err := http.PostForm("https://httpbin.org/post", formData)
+	if err != nil {
+		log.Fatalln(err)
+	}
+
+	var result map[string]interface{}
+
+	json.NewDecoder(resp.Body).Decode(&result)
+
+	log.Println(result["form"])
+
+	fmt.Println("OK")
+}
+
+func queryExample() {
+	// Создаем URL с параметрами
+	baseURL := "https://example.com/api/resource"
+	params := url.Values{}
+	params.Add("param1", "value1")
+	params.Add("param2", "value2")
+
+	fullURL := baseURL + "?" + params.Encode()
+
+	fmt.Println(fullURL)
+
+	// Отправляем GET-запрос
+	response, err := http.Get(fullURL)
+	if err != nil {
+		fmt.Println("Ошибка при отправлке GET-запроса:", err)
+		return
+	}
+	defer response.Body.Close()
+
+	// Чтение ответа
+	// ...
+
+	// Обработка ответа
+	// ...
+
+}

+ 98 - 0
go/stepik/4/timeout.go

@@ -0,0 +1,98 @@
+package main
+
+import (
+	"fmt"
+	"io"
+	"log"
+	"net"
+	"net/http"
+	"os"
+)
+
+func main() {
+	// httpExample()
+	httpExample2()
+	/*
+		// Подключаемся к серверу
+		conn, err := net.Deal("tcp", "localhost:4545")
+		if err != nil {
+			fmt.Println(err)
+			return
+		}
+		defer conn.Close()
+
+		for {
+			var source string
+			// Запрашиваем у пользователя ввод
+			fmt.Print("Введите слово: ")
+			_, err := fmt.Scan(&source)
+			if err != nil {
+				fmt.Println("Некорректный ввод", err)
+				continue
+			}
+
+			// Отправляем сообщение
+			if n, err := conn.Write([]byte(source)); n == 0 || err != nil {
+				fmt.Println(err)
+				return
+			}
+
+			// Устанавливаем таймаут на чтение ответа
+			fmt.Println("Ответ:")
+			conn.SetReadDeadLine(time.Now().Add(time.Second * 5))
+
+			// Чтение данных в отдельном цикле
+			// Если сервер пришлет больше данных, они будут обработаны
+			for {
+				buff := make([]byte, 1024)
+				n, err := conn.Read(buff)
+				if err != nil {
+					break
+				}
+				fmt.Print(string(buff[0:n]))
+				// Сбрасываем таймаут до 700 миллисекунд после первых 1024 байт
+				conn.SetReadDeadLine(time.Now().Add(time.Millisecond))
+			}
+		}
+	*/
+}
+
+func httpExample() {
+	httpRequest := "GET / HTTP/1.1\n" +
+		"Host: go.dev\r\n" +
+		"Connection: close\r\n" +
+		"\r\n"
+	conn, err := net.Dial("tcp", "go.dev:80")
+	if err != nil {
+		fmt.Println(err)
+		return
+	}
+	defer conn.Close()
+
+	if _, err = conn.Write([]byte(httpRequest)); err != nil {
+		fmt.Println(err)
+		return
+	}
+
+	io.Copy(os.Stdout, conn)
+	fmt.Println("Done")
+}
+
+func httpExample2() {
+	// http запрос с методом GET
+	resp, err := http.Get("https://golang.org")
+	if err != nil {
+		log.Println(err)
+		return
+	}
+	// Закрываем телол ответа после работы с ним
+	defer resp.Body.Close()
+
+	data, err := io.ReadAll(resp.Body) // читаем ответ
+	if err != nil {
+		log.Println(err)
+		return
+	}
+
+	fmt.Printf("%s", data)
+}