@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()
. Это важно, чтобы избежать утечки ресурсов.
@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()
, чтобы избежать утечки ресурсов.