ホームページ > バックエンド開発 > Golang > Gin を使用してマルチパート/フォームデータリクエストで JSON データと画像を処理する方法は?

Gin を使用してマルチパート/フォームデータリクエストで JSON データと画像を処理する方法は?

Mary-Kate Olsen
リリース: 2024-12-01 21:01:11
オリジナル
838 人が閲覧しました

How to Handle JSON Data and Images in Multipart/Form-Data Requests with Gin?

Go: Jin を使用したフォーム内の JSON データと画像の処理

Gin は、HTTP リクエストの処理を簡素化する Go の人気のある Web フレームワークです。この記事では、Gin のバインディング メカニズムを使用したマルチパート/フォームデータ リクエストからの JSON データと画像の両方の解析に関する特定の問題について説明します。

リクエスト処理コード

リクエストGin のハンドラー関数は、HTTP リクエストを受信して​​処理します。この場合、JSON データと画像ファイルの両方を含むマルチパート リクエストを受信することが期待されます。

func (h *Handlers) UpdateProfile() gin.HandlerFunc {
    type request struct {
        Username    string `json:"username" binding:"required,min=4,max=20"`
        Description string `json:"description" binding:"required,max=100"`
    }

    return func(c *gin.Context) {
        var updateRequest request

        // Bind JSON data to `updateRequest` struct.
        if err := c.BindJSON(&updateRequest); err != nil {
            // Handle error here...
            return
        }

        // Get the image file from the request.
        avatar, err := c.FormFile("avatar")
        if err != nil {
            // Handle error here...
            return
        }

        // Validate file size and content type.
        if avatar.Size > 3<<20 || !avatar.Header.Get("Content-Type") { // if avatar size more than 3mb
            // Handle error here...
            return
        }

        // Handle image processing and database operations here...
        // Save username, description, and image to a database.

        c.IndentedJSON(http.StatusNoContent, gin.H{"message": "successful update"})
    }
}
ログイン後にコピー

テスト ケース

検証するための単体テストが含まれています。ハンドラーの機能。 multipart/form-data 本体を使用してモックリクエストを設定します。リクエストには JSON データと画像が含まれています。

func TestUser_UpdateProfile(t *testing.T) {
    type testCase struct {
        name               string
        image              io.Reader
        username           string
        description        string
        expectedStatusCode int
    }

    // Set up mock request with multipart/form-data body.
    // ...

    for _, tc := range testCases {
        // ...

        w := httptest.NewRecorder()
        router.ServeHTTP(w, req)

        assert.Equal(t, tc.expectedStatusCode, w.Result().StatusCode)
    }
}
ログイン後にコピー

テスト中のエラー

テスト中に、リクエスト本文の無効な文字によりエラーが発生しました。エラー メッセージは「エラー #01: 数値リテラルに無効な文字 '-'」でした。

根本原因

Gin の c.BindJSON 関数は、JSON データの解析に使用されます。リクエスト本文から。ただし、リクエスト本文が有効な JSON で始まることを前提としています。マルチパート/フォームデータリクエストの場合、本文は境界 (--30b24345de...) で始まりますが、これは JSON リテラルとしては無効な文字です。

Solution

この問題を解決するには、Gin の c.ShouldBind 関数を binding.FormMultipart とともに使用して、明示的にバインドします。マルチパート/フォームデータ本体。これにより、Gin は JSON データと画像ファイルの両方を適切に解析できるようになります。

// Bind JSON data and image file to `updateRequest` struct.
if err := c.ShouldBindWith(&updateRequest, binding.FormMultipart); err != nil {
    // Handle error here...
    return
}
ログイン後にコピー

結論

この記事では、JSON データと画像ファイルを同時に処理する方法を説明します。ジンを使用したマルチパート/フォームデータリクエストで。解析エラーを避けるために、正しいバインディング メソッド (c.ShouldBindWith(..., binding.FormMultipart)) を使用することの重要性を強調しています。

以上がGin を使用してマルチパート/フォームデータリクエストで JSON データと画像を処理する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート