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() // Чтение ответа // ... // Обработка ответа // ... } // http.NewRequest() // Todo - структура для представления объекта Todo type Todo struct { UserID int `json:"userId"` ID int `json:"id"` Title string `json:"title"` Complete bool `json:"completed"` } func newRequestExample() { todo := Todo{ UserID: 1, ID: 2, Title: "наш title", Complete: true, } // Кодируем структуру Todo в формат JSON jsonReq, err := json.Marshal(todo) if err != nil { log.Println(err) return } // URL сервера baseURL := "https://jsonplaceholder.typicode.com/posts/1" // Создаем новый HTTP-запрос с методом POST req, err := http.NewRequest("POST", baseURL, bytes.NewBuffer(jsonReq)) if err != nil { log.Println("Ошибка при создании запроса:", err) return } // Устанавливаем заголовки запроса req.Header.Set("Content-Type", "application/json; charset=UTF-8") // Отправляем запрос client := &http.Client{} // Создаем http клиент response, err := client.Do(req) // передаем выше подготовленный запрос на отправку if err != nil { log.Println("Ошибка при выполнении запроса: ", err) return } defer response.Body.Close() // не забываем закрыть тело // Читаем и конвертируем тело ответа в байты bodyBytes, err := io.ReadAll(response.Body) if err != nil { log.Println(err) } // Конвертируем тело ответа в строку и выводим bodyString := string(bodyBytes) fmt.Printf("API ответ в форме строки: %s\n", bodyString) // Конвертируем тело ответа в Todo struct var todoStruct Todo err = json.Unmarshl(bodyBytes, &todoStruct) if err != nil { log.Println(err) } // Выводим структуру fmt.Printf("API ответ в форме struct:\n%+v\n", todoStruct) // Вывод статуса ответа (если 200 - то успешный) fmt.Println("Статус ответа:", response.Status) }