Как прочитать бинарные данные из http.request в golang?

Пользователь

от loyal , в категории: Golang , 2 года назад

Как прочитать бинарные данные из http.request в golang?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от urban_will , 2 года назад

@loyal 

В Go для чтения бинарных данных из http.Request можно использовать пакет io/ioutil.


Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
package main

import (
	"fmt"
	"io/ioutil"
	"log"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	// Чтение бинарных данных из тела запроса
	body, err := ioutil.ReadAll(r.Body)
	if err != nil {
		http.Error(w, "Error reading request body", http.StatusInternalServerError)
		return
	}
	defer r.Body.Close()

	// Обработка бинарных данных
	fmt.Println(body)

	// Отправка ответа
	fmt.Fprint(w, "Request body received
")
}

func main() {
	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}


В этом примере функция ioutil.ReadAll используется для чтения бинарных данных из тела запроса. Затем данные обрабатываются по необходимости. В конце ответ отправляется клиенту.


Обратите внимание, что мы закрываем тело запроса в конце чтения с помощью defer r.Body.Close(). Это важно, чтобы избежать утечки ресурсов.

Пользователь

от clifford , год назад

@loyal 

Если вы хотите читать бинарные данные постепенно из http.Request, вы можете использовать метод Read из http.Request.Body, который реализует интерфейс io.Reader. Вот пример кода:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package main

import (
	"fmt"
	"io"
	"log"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	// Создание буфера для чтения данных
	buffer := make([]byte, 4096)

	for {
		// Чтение следующего блока данных
		n, err := r.Body.Read(buffer)
		if err != nil && err != io.EOF {
			log.Fatal(err)
		}

		// Обработка прочитанных данных
		fmt.Println(buffer[:n])

		// Завершение цикла, если достигнут конец данных
		if err == io.EOF {
			break
		}
	}

	// Отправка ответа
	fmt.Fprint(w, "Request body received
")
}

func main() {
	http.HandleFunc("/", handler)
	log.Fatal(http.ListenAndServe(":8080", nil))
}


В этом примере блок данных читается в буфер с помощью r.Body.Read(buffer). После этого вы можете обрабатывать прочитанные данные по необходимости. Цикл продолжается до тех пор, пока не достигнут конец данных (io.EOF). Обратите внимание, что метод Read может прочитать менее или равное количеству запрошенных байтов, поэтому buffer[:n] используется для правильной обработки только прочитанных данных.


Независимо от того, какой подход вы выберете, не забудьте закрыть тело запроса с помощью defer r.Body.Close(), чтобы избежать утечки ресурсов.