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 サイトの他の関連記事を参照してください。