Table des matières
Bonne réponse
gestionnaire http
Fonctions principales
Considérations finales
Maison développement back-end Golang Publier des données binaires (flux d'application/d'octets)

Publier des données binaires (flux d'application/d'octets)

Feb 05, 2024 pm 09:15 PM
bibliothèque standard

Publier des données binaires (flux dapplication/doctets)

Contenu de la question

Je souhaite télécharger un fichier avec le type de contenu défini sur application/octet-stream et les données binaires du fichier dans le corps de la requête. Comment ferais-je cela en golang, voici mon code de départ :

package main

import (
    "fmt"
    "log"
    "net/http"
    "net/http/httputil"
    "os"
)

func main() {
    file, err := os.Open("file.pdf")
    if err != nil {
        log.Fatalln(err)
    }

    req, err := http.NewRequest("POST", fmt.Sprintf("https://example.com/upload"), nil)
    req.Header.Add("Content-Type", "application/octet-stream")

    if err != nil {
        log.Fatalln(err)
    }

    client := &http.Client{
        Transport: &http.Transport{
            DisableCompression: true,
        },
    }

    resp, err := client.Do(req)
    if err != nil {
        log.Fatalln(err)
    }
    defer resp.Body.Close()

    reqDump, err := httputil.DumpRequest(req, true)
    if err != nil {
        log.Fatalln(err)
    }

    fmt.Println(reqDump)
}
Copier après la connexion


Bonne réponse


J'ai préparé une réponse qui peut vous aider à résoudre votre problème. Tout le code appartient aux fonctions main.go 文件,只是为了演示。它有两个主要部分:handlermain. Commençons par le gestionnaire.

gestionnaire http

func handlefile(w http.responsewriter, r *http.request) {
    if r.method != http.methodpost {
        w.writeheader(http.statusmethodnotallowed)
        return
    }
    fmt.println("handlefile")
    data, err := io.readall(r.body)
    if err != nil {
        panic(err)
    }
    defer r.body.close()
    w.write(data)
}
Copier après la connexion

Ici, je me base uniquement sur ce que vous utilisez (allez à la bibliothèque standard uniquement : httpiofmt package). Nous avons juste besoin d'écrire la charge utile entrante lue à partir de la requête http dans le flux de réponse.

Fonctions principales

func main() {
    r := http.NewServeMux()
    r.HandleFunc("/example", HandleFile)
    srv := http.Server{
        Addr:    ":8000",
        Handler: r,
    }

    var wg sync.WaitGroup
    wg.Add(1)
    go func() {
        defer wg.Done()
        if err := srv.ListenAndServe(); err != nil {
            fmt.Println(err.Error())
        }
    }()

    file, err := os.Open("file.txt")
    if err != nil {
        panic(err)
    }
    defer file.Close()
    req, err := http.NewRequest(http.MethodPost, "http://localhost:8000/example", file)
    if err != nil {
        panic(err)
    }
    req.Header.Set("Content-Type", "application/octet-stream")
    client := &http.Client{
        Transport: &http.Transport{
            DisableCompression: true,
        },
    }
    res, err := client.Do(req)
    if err != nil {
        panic(err)
    }
    defer res.Body.Close()
    data, err := io.ReadAll(res.Body)
    if err != nil {
        panic(err)
    }
    fmt.Println(string(data))

    srv.Shutdown(context.Background())
    wg.Wait()
}
Copier après la connexion

En revanche, les fonctions main ont plus de logique à gérer. Passons-les en revue dans la liste :

  1. Il crée un serveur http pour répondre aux demandes entrantes. Nous l'instrumentons pour les requêtes en utilisant le point de terminaison handlefile 处理程序来回复针对 /example que nous avons créé précédemment.
  2. Nous utilisons sync.waitgroup pour exécuter le serveur dans une goroutine distincte. Grâce à cela, le serveur est opérationnel, mais nous pouvons continuer notre programme et y envoyer des requêtes http.
  3. Nous préparons une requête http avec le contenu du fichier lu depuis le système de fichiers local (dans notre cas, la fonction file.txt)。我们将 content-type 标头设置为 application/octet-stream 并将文件句柄传递给 newrequest.
  4. Nous faisons une requête et imprimons le contenu de la charge utile de la réponse http.
  5. Nous arrêtons le serveur et utilisons la méthode wg.wait pour dire au groupe d'attente d'attendre toutes les goroutines.

Considérations finales

Le code écrit ici peut certainement être amélioré. Quoi qu'il en soit, juste à titre de démonstration, je préfère le garder aussi proche que possible du fichier original pour vous permettre de mieux comprendre comment publier des binaires sur un serveur http et comment exécuter le même programme client et serveur. S'il y a quelque chose qui n'est pas clair, dites-le-moi, merci !

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 de ce site Web
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

Outils d'IA chauds

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

AI Hentai Generator

AI Hentai Generator

Générez AI Hentai gratuitement.

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Comment utiliser la valeur absolue en C++ Comment utiliser la valeur absolue en C++ May 06, 2024 pm 06:15 PM

Il existe deux manières d'obtenir des valeurs absolues en C++ : 1. Utilisez la fonction intégrée abs() pour obtenir la valeur absolue d'un type entier ou à virgule flottante 2. Utilisez la fonction générique std::abs() pour ; obtenir diverses valeurs absolues prises en charge. Fonctionne sur les valeurs absolues des types de données.

Comment utiliser std :: en C++ Comment utiliser std :: en C++ May 09, 2024 am 03:45 AM

std est l'espace de noms en C++ qui contient les composants de la bibliothèque standard. Pour utiliser std, utilisez l'instruction "using namespace std;". L'utilisation de symboles directement à partir de l'espace de noms std peut simplifier votre code, mais n'est recommandée que lorsque cela est nécessaire pour éviter la pollution de l'espace de noms.

Que signifie premier en C++ Que signifie premier en C++ May 07, 2024 pm 11:33 PM

prime est un mot-clé en C++, indiquant le type de nombre premier, qui ne peut être divisé que par 1 et lui-même. Il est utilisé comme type booléen pour indiquer si la valeur donnée est un nombre premier. S'il s'agit d'un nombre premier, c'est le cas. vrai, sinon c'est faux.

_utilisation complexe en langage C _utilisation complexe en langage C May 08, 2024 pm 01:27 PM

Le type complexe est utilisé pour représenter des nombres complexes en langage C, y compris des parties réelles et imaginaires. Sa forme d'initialisation est complex_number = 3.14 + 2.71i, la partie réelle est accessible via creal(complex_number) et la partie imaginaire est accessible via cimag(complex_number). Ce type prend en charge les opérations mathématiques courantes telles que l'addition, la soustraction, la multiplication, la division et le modulo. De plus, un ensemble de fonctions permettant de travailler avec des nombres complexes est fourni, telles que cpow, csqrt, cexp et csin.

Que signifie fabs en C++ Que signifie fabs en C++ May 08, 2024 am 01:15 AM

La fonction fabs() est une fonction mathématique en C++ qui calcule la valeur absolue d'un nombre à virgule flottante, supprime le signe négatif et renvoie une valeur positive. Il accepte un paramètre à virgule flottante et renvoie une valeur absolue de type double. Par exemple, fabs(-5.5) renvoie 5,5. Cette fonction fonctionne avec des nombres à virgule flottante, dont la précision est affectée par le matériel sous-jacent.

Que signifie la configuration en Java ? Que signifie la configuration en Java ? May 07, 2024 am 02:39 AM

Config représente les informations de configuration en Java et est utilisé pour ajuster le comportement de l'application. Il est généralement stocké dans des fichiers ou des bases de données externes et peut être géré via Java Properties, PropertyResourceBundle, Java Configuration Framework ou des bibliothèques tierces. Ses avantages incluent le découplage et la flexibilité. sensibilisation à l'environnement, gérabilité, évolutivité.

Que signifie min en C++ Que signifie min en C++ May 08, 2024 am 12:51 AM

La fonction min en C++ renvoie le minimum de plusieurs valeurs. La syntaxe est : min(a, b), où a et b sont les valeurs à comparer. Vous pouvez également spécifier une fonction de comparaison pour prendre en charge les types qui ne prennent pas en charge l'opérateur <. C++20 a introduit la fonction std::clamp, qui gère le minimum de trois valeurs ou plus.

Comment calculer la valeur absolue en C++ Comment calculer la valeur absolue en C++ May 06, 2024 pm 06:21 PM

Il existe trois façons de trouver la valeur absolue en C++ : À l’aide de la fonction abs(), vous pouvez calculer la valeur absolue de n’importe quel type de nombre. À l'aide de la fonction std::abs(), vous pouvez calculer la valeur absolue d'entiers, de nombres à virgule flottante et de nombres complexes. Calcul manuel de valeurs absolues, adapté aux entiers simples.

See all articles