Go での HTTP リクエストからのファイルと JSON の解析
AngularJS フロントエンドから HTTP リクエストを構築する場合、次のことが必要になる場合があります。ファイルと JSON データの両方を解析します。これは、特にリクエスト本文から JSON データを解析しようとする場合に、困難になる可能性があります。
次の HTTP リクエスト ペイロードを考えてみましょう:
Content-Disposition: form-data; name="file"; filename="Parent Handbook.pdf" Content-Type: application/pdf Content-Disposition: form-data; name="doc" {"title":"test","cat":"test cat","date":20142323}
このシナリオでは、「ファイル」は PDF を表します。
ファイルと JSON データの両方を効果的に解析するために、Go は適切なソリューションを提供します。これを実現する方法は次のとおりです。
r.Body に JSON データが含まれていると仮定する代わりに、r.MultipartReader() を利用して PDF 部分と JSON 部分の両方を個別に処理する必要があります。この関数は、r.NextPart() を使用してリクエストのさまざまな部分を反復処理できる mime/multipart.Reader オブジェクトを提供します。
改訂されたハンドラー関数の例を次に示します。
<code class="go">func (s *Server) PostFileHandler(w http.ResponseWriter, r *http.Request) { mr, err := r.MultipartReader() if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } doc := Doc{} for { part, err := mr.NextPart() // No more parts if err == io.EOF { break } // Error occurred if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } // PDF 'file' part if part.FormName() == "file" { doc.Url = part.FileName() outfile, err := os.Create("./docs/" + part.FileName()) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } defer outfile.Close() _, err = io.Copy(outfile, part) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return } } // JSON 'doc' part if part.FormName() == "doc" { jsonDecoder := json.NewDecoder(part) err = jsonDecoder.Decode(&doc) if err != nil { http.Error(w, err.Error(), http.StatusInternalServerError) return }</code>
以上がGo で HTTP リクエストからファイルと JSON を解析する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。