Golang を Web 開発に使用する場合、処理のために HTTP リクエストの本文部分 (POST リクエストに含まれる送信データなど) を読み取る必要がある場合があります。この記事では、Golang が HTTP リクエストの本文を読み取る方法を紹介します。
1. ioutil.ReadAll() を使用して読み取る
Golang 標準ライブラリの ioutil パッケージには、io.Reader 型データ内のすべてのオブジェクトを読み取ることができる ReadAll() 関数が用意されています。 []byte 型のデータを返します。したがって、http.Request.Body フィールドをパラメータとして ReadAll() 関数に渡すことで、HTTP リクエストの本文部分を読み取ることができます。
package main import ( "fmt" "io/ioutil" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { body, err := ioutil.ReadAll(r.Body) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer r.Body.Close() // 处理body数据 fmt.Fprint(w, string(body)) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
上記サンプルコードでは、HTTPリクエストのボディ部分を読み取って文字列型に変換するHTTPリクエスト処理関数handler()を定義しています。 HTTP レスポンスに送信されます。
ioutil.ReadAll() 関数を使用して HTTP リクエストの本文を読み取る場合、関数がリソースを解放するために戻った後に http.Request.Body フィールドを閉じる必要があることに注意してください。ここでは defer ステートメントを使用して、関数の実行後にフィールドが確実に閉じられるようにします。
2. json.Decoder を使用して JSON データを読み取る
HTTP リクエストの本文部分が JSON 形式のデータの場合、Golang で json.Decoder タイプを使用して、 JSON データ そして Golang のデータ構造に解析されます。サンプル コードは次のとおりです。
package main import ( "encoding/json" "fmt" "net/http" ) type User struct { Username string `json:"username"` Password string `json:"password"` } func handler(w http.ResponseWriter, r *http.Request) { var user User err := json.NewDecoder(r.Body).Decode(&user) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer r.Body.Close() // 处理user对象 fmt.Fprintf(w, "Username: %s, Password: %s", user.Username, user.Password) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
上記のサンプル コードでは、User という名前の構造体型を定義し、HTTP リクエスト処理関数 Object 内の json.NewDecoder() 関数を使用して json.Decoder 型を作成しました。次に、その Decode() メソッドを使用して、HTTP リクエストの本文部分をユーザー タイプ データに直接解析し、処理します。
json.Decoder を使用して HTTP リクエストの本文を読み取る場合、関数がリソースを解放するために戻る前に http.Request.Body フィールドを閉じる必要があることに注意してください。さらに、解析された JSON データを構造オブジェクトに入力できるように、Decode() メソッドのパラメーターとしてターゲットの構造タイプへのポインター (たとえば、&user) を渡す必要があります。
3. xml.Decoder を使用して XML データを読み取る
HTTP リクエストの本文部分が XML 形式のデータの場合、同様に Golang で xml.Decoder タイプを使用してそれを読み取ることができます。 XML データを直接変換し、Golang データ構造に解析します。
package main import ( "encoding/xml" "fmt" "net/http" ) type User struct { XMLName xml.Name `xml:"user"` Username string `xml:"username"` Password string `xml:"password"` } func handler(w http.ResponseWriter, r *http.Request) { var user User err := xml.NewDecoder(r.Body).Decode(&user) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer r.Body.Close() // 处理user对象 fmt.Fprintf(w, "Username: %s, Password: %s", user.Username, user.Password) } func main() { http.HandleFunc("/", handler) http.ListenAndServe(":8080", nil) }
上記のサンプル コードでは、User という名前の構造体型を定義し、HTTP リクエスト処理関数の xml.NewDecoder() 関数を使用して xml.Decoder 型を作成しました。次に、その Decode() メソッドを使用して、HTTP リクエストの本文部分をユーザー タイプのデータに直接解析し、処理します。
xml.Decoder を使用して HTTP リクエストの本文を読み取る場合、関数がリソースの解放に戻る前に http.Request.Body フィールドを閉じる必要があることに注意してください。さらに、ターゲット構造タイプの各フィールドに対応する XML ノードの名前を指定する必要があります (たとえば、Username フィールドに対応する XML ノードは username です)。
概要
この記事では、Golang が HTTP リクエストの本文を読み取る方法を紹介します。標準ライブラリの ioutil パッケージ、json.Decoder 型、および xml.Decoder 型を使用すると、HTTP リクエストのボディ部分を Golang のデータ構造に簡単に読み込んで解析して処理できます。
以上がgolang はリクエスト本文を読み取りますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。