ホームページ >バックエンド開発 >Golang >golang はリクエスト本文を読み取ります

golang はリクエスト本文を読み取ります

PHPz
PHPzオリジナル
2023-05-15 10:48:092260ブラウズ

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 ノードは us​​ername です)。

概要

この記事では、Golang が HTTP リクエストの本文を読み取る方法を紹介します。標準ライブラリの ioutil パッケージ、json.Decoder 型、および xml.Decoder 型を使用すると、HTTP リクエストのボディ部分を Golang のデータ構造に簡単に読み込んで解析して処理できます。

以上がgolang はリクエスト本文を読み取りますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。