net_http.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. package main
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io"
  7. "log"
  8. "net/http"
  9. "net/url"
  10. )
  11. // User - структура для представления объекта пользователя
  12. type User struct {
  13. Name string `json:"name"`
  14. ID uint32 `json:"id"`
  15. }
  16. type Output struct {
  17. JSON struct {
  18. Name string `json:"name"`
  19. ID uint32 `json:"id"`
  20. } `json:"json"`
  21. URL string `json:"usr"`
  22. }
  23. func main() {
  24. // foo1()
  25. // postFormExample()
  26. queryExample()
  27. }
  28. func foo1() {
  29. // Создаем экземпляр структуры User
  30. var u = User{
  31. Name: "Alex",
  32. ID: 1,
  33. }
  34. // Кодируем структуру User в JSON (байтовый срез)
  35. bytesRepresentation, err := json.Marshal(u)
  36. if err != nil {
  37. log.Fatalln(err)
  38. }
  39. // Отправляем POST-запрос на сервер с JSON-телом
  40. resp, err := http.Post("https://httpbin.org/post", "application/json", bytes.NewBuffer(bytesRepresentation))
  41. if err != nil {
  42. log.Fatalln(err)
  43. }
  44. // Читаем и конвертируем тело ответа в байты
  45. bytesResp, err := io.ReadAll(resp.Body)
  46. if err != nil {
  47. log.Println(err)
  48. return
  49. }
  50. // Выводим содержимое тела ответа
  51. // fmt.Println(string(bytesResp))
  52. // Создаем экземпляр ответа сервера
  53. var out Output
  54. // Декодируем данные в формате JSON и заполняем структуру
  55. err = json.Unmarshal(bytesResp, &out)
  56. if err != nil {
  57. log.Println(err)
  58. return
  59. }
  60. fmt.Printf("%+v\n", out)
  61. fmt.Println(out.URL)
  62. /*
  63. var st string
  64. json.Unmarshal(bytesRepresentation, &st)
  65. fmt.Println(st)
  66. */
  67. }
  68. // Отправка данных в виде формы
  69. func postFormExample() {
  70. formData := url.Values{
  71. "name": {"hello"},
  72. "surename": {"golang post form"},
  73. }
  74. resp, err := http.PostForm("https://httpbin.org/post", formData)
  75. if err != nil {
  76. log.Fatalln(err)
  77. }
  78. var result map[string]interface{}
  79. json.NewDecoder(resp.Body).Decode(&result)
  80. log.Println(result["form"])
  81. fmt.Println("OK")
  82. }
  83. func queryExample() {
  84. // Создаем URL с параметрами
  85. baseURL := "https://example.com/api/resource"
  86. params := url.Values{}
  87. params.Add("param1", "value1")
  88. params.Add("param2", "value2")
  89. fullURL := baseURL + "?" + params.Encode()
  90. fmt.Println(fullURL)
  91. // Отправляем GET-запрос
  92. response, err := http.Get(fullURL)
  93. if err != nil {
  94. fmt.Println("Ошибка при отправлке GET-запроса:", err)
  95. return
  96. }
  97. defer response.Body.Close()
  98. // Чтение ответа
  99. // ...
  100. // Обработка ответа
  101. // ...
  102. }
  103. // http.NewRequest()
  104. // Todo - структура для представления объекта Todo
  105. type Todo struct {
  106. UserID int `json:"userId"`
  107. ID int `json:"id"`
  108. Title string `json:"title"`
  109. Complete bool `json:"completed"`
  110. }
  111. func newRequestExample() {
  112. todo := Todo{
  113. UserID: 1,
  114. ID: 2,
  115. Title: "наш title",
  116. Complete: true,
  117. }
  118. // Кодируем структуру Todo в формат JSON
  119. jsonReq, err := json.Marshal(todo)
  120. if err != nil {
  121. log.Println(err)
  122. return
  123. }
  124. // URL сервера
  125. baseURL := "https://jsonplaceholder.typicode.com/posts/1"
  126. // Создаем новый HTTP-запрос с методом POST
  127. req, err := http.NewRequest("POST", baseURL, bytes.NewBuffer(jsonReq))
  128. if err != nil {
  129. log.Println("Ошибка при создании запроса:", err)
  130. return
  131. }
  132. // Устанавливаем заголовки запроса
  133. req.Header.Set("Content-Type", "application/json; charset=UTF-8")
  134. // Отправляем запрос
  135. client := &http.Client{} // Создаем http клиент
  136. response, err := client.Do(req) // передаем выше подготовленный запрос на отправку
  137. if err != nil {
  138. log.Println("Ошибка при выполнении запроса: ", err)
  139. return
  140. }
  141. defer response.Body.Close() // не забываем закрыть тело
  142. // Читаем и конвертируем тело ответа в байты
  143. bodyBytes, err := io.ReadAll(response.Body)
  144. if err != nil {
  145. log.Println(err)
  146. }
  147. // Конвертируем тело ответа в строку и выводим
  148. bodyString := string(bodyBytes)
  149. fmt.Printf("API ответ в форме строки: %s\n", bodyString)
  150. // Конвертируем тело ответа в Todo struct
  151. var todoStruct Todo
  152. err = json.Unmarshl(bodyBytes, &todoStruct)
  153. if err != nil {
  154. log.Println(err)
  155. }
  156. // Выводим структуру
  157. fmt.Printf("API ответ в форме struct:\n%+v\n", todoStruct)
  158. // Вывод статуса ответа (если 200 - то успешный)
  159. fmt.Println("Статус ответа:", response.Status)
  160. }