Maison >développement back-end >Golang >Comment analyser des fichiers et JSON à partir de requêtes HTTP dans Go

Comment analyser des fichiers et JSON à partir de requêtes HTTP dans Go

DDD
DDDoriginal
2024-10-24 22:12:02840parcourir

How to Parse Files and JSON from HTTP Requests in Go

Analyse de fichiers et JSON à partir de requêtes HTTP dans Go

Lors de la construction d'une requête HTTP à partir d'un frontal AngularJS, vous pouvez rencontrer le besoin de analyser à la fois un fichier et des données JSON. Cela peut être difficile, en particulier lorsque vous tentez d'analyser les données JSON du corps de la requête.

Considérez la charge utile de la requête HTTP suivante :

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}

Dans ce scénario, « fichier » représente le PDF. document, tandis que "doc" contient les données JSON que vous souhaitez analyser.

Pour analyser efficacement à la fois le fichier et les données JSON, Go fournit une solution appropriée. Voici comment y parvenir :

Au lieu de supposer que r.Body contient les données JSON, vous devez utiliser r.MultipartReader() pour traiter séparément les parties PDF et JSON. Cette fonction fournit un objet mime/multipart.Reader qui vous permet de parcourir les différentes parties de la requête à l'aide de r.NextPart().

Voici un exemple de fonction de gestionnaire révisée :

<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>

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn