07/09/2018, 11:12

Cách đọc request body data trong Golang

Trong lập trình web thì việc đọc dữ liệu của request body (hay còn gọi là request body data) là một tác vụ rất phổ biến. Golang hỗ trợ package có tên là net.http giúp chúng ta xây dựng ứng dụng web server. Và package này cũng hỗ trợ việc lấy request body data một cách dễ dàng. Trong bài viết ...

Trong lập trình web thì việc đọc dữ liệu của request body (hay còn gọi là request body data) là một tác vụ rất phổ biến. Golang hỗ trợ package có tên là net.http giúp chúng ta xây dựng ứng dụng web server. Và package này cũng hỗ trợ việc lấy request body data một cách dễ dàng.

Cách đọc request body data trong Golang

Trong bài viết này chúng ta sẽ tìm hiểu cách đọc dữ liệu request body trong Golang sử dụng package ioutil. Giả sử chúng ta cần đọc dữ liệu request body trong một handler lấy tên là testHandler thì lúc này code sẽ như sau:

func testHandler(resWriter http.ResponseWriter, req *http.Request) {
        // Bước 1: Đọc dữ liệu request body sử dụng ioutil.ReadAll()
        body, err := ioutil.ReadAll(req.Body)
        if err != nil {
            fmt.Printf("Error reading body data: %v", err)
            http.Error(res, "can't read body", http.StatusBadRequest)
            return
        }

        // Bước 2: Sử dụng dữ liệu của request body 

        // Biến body lúc này chứachứa dữ liệu request body 
        fmt.Printf("Body data: %v", body)

        // code ...
        //  ...

        // Bước 3: Gán lại giá trị cho request body
        req.Body = ioutil.NopCloser(bytes.NewBuffer(body))

        // code ...
        //  ...
}

Ở trên bạn chú ý bước đọc dữ liệu được thực hiện ở dòng code đầu tiên trong handler function:

body, err := ioutil.ReadAll(req.Body)

Thực hiện việc đọc dữ liệu request body sử dụng ioutil.ReadAll(). Và theo sau bởi một câu lệnh if kiểm tra lỗi trả về từ việc đọc dữ liệu này.

        if err != nil {
            fmt.Printf("Error reading body data: %v", err)
            http.Error(res, "can't read body", http.StatusBadRequest)
            return
        }

Sau đó chúng ta có thể làm việc với dữ liệu request body thông qua biến body:

fmt.Printf("Body data: %v", body)

Việc gọi ioutil.ReadAll(req.Body) sẽ khiến toàn bộ dữ liệu trong req.Body bị xoá đi, do đó để đảm các đoạn code khác phía sau nếu muốn vẫn có thể tiếp tục lấy được dữ liệu ban đầu của request body thì chúng ta cần gán lại giá trị này:

req.Body = ioutil.NopCloser(bytes.NewBuffer(body))
0