Maison > développement back-end > Golang > Comment définir le rappel de lecture pour la requête net/http GET, comme en utilisant go-curl ?

Comment définir le rappel de lecture pour la requête net/http GET, comme en utilisant go-curl ?

WBOY
Libérer: 2024-02-11 09:24:08
avant
392 Les gens l'ont consulté

如何像使用 go-curl 一样为 net/http GET 请求设置读取回调?

L'éditeur PHP Xigua vous présentera comment définir un rappel de lecture pour la requête net/http GET afin d'obtenir une fonction similaire à go-curl. Lorsque vous utilisez la bibliothèque net/http pour lancer une requête GET, nous pouvons utiliser les méthodes associées des structures http.Client et http.Request pour définir la fonction de rappel de lecture. En définissant la valeur de http.Response.Body sur une structure personnalisée qui implémente l'interface io.Reader, nous pouvons effectuer des opérations de rappel lors de la lecture du contenu de la réponse. De cette manière, nous pouvons réaliser des opérations plus flexibles et personnalisées dans le processus de traitement des requêtes HTTP, améliorant ainsi la maintenabilité et l'évolutivité du code.

Contenu de la question

Nous avons un programme Golang fonctionnel qui peut obtenir des instantanés/images des caméras Dahua. Nous aimerions améliorer cela en ajoutant une fonction de rappel de lecture pour l'URI suivant - http://192.168.x.x/cgi-bin/eventManager.cgi?action=attach&codes=[VideoMotion]. Cet URI maintient le socket ouvert du côté de la caméra, à travers lequel la caméra continue d'envoyer des événements.

Nous avons essayé d'utiliser go-curl car il prend en charge l'enregistrement des rappels de lecture. Cependant, ce package ne prend pas en charge l'architecture MIPS. Nous ne pouvons donc pas l'utiliser. Tout conseil/aide serait utile. Voici le code de travail pour la récupération d'instantanés.

package main

import (
    "fmt"
    "log"
    "net/http"

    "github.com/icholy/digest"
)

const (
    username = "xxxxx"
    password = "xxxxx"
    uri = "http://192.168.x.x/cgi-bin/snapshot.cgi"
)

func main() {
    client := &http.Client{
        Transport: &digest.Transport{
            Username: username,
            Password: password,
        },
    }

    resp, err := client.Get(uri)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    if resp.StatusCode != http.StatusOK {
        log.Fatalf("Error: Status code %d", resp.StatusCode)
    } else {
        fmt.Println("Snapshot fetched")
    }

    // Perform next steps
}
Copier après la connexion

Solution de contournement

J'ai mal compris que l'appel client.Get(uri) était bloqué. Le commentaire suivant de @kotix m'a fait repenser mon code. Après avoir ajouté l'impression sous client.Get(uri), confirmez pour continuer l'exécution.

C'est le code complet pour imprimer un événement à son arrivée.

package main

import (
    "log"
    "net/http"
    "io"
    "github.com/icholy/digest"
)

const (
    username = "xxxx"
    password = "xxxx"
    uri = "http://192.168.x.xxx/cgi-bin/eventManager.cgi?action=attach&codes=[VideoMotion]"
)

func main() {
    client := &http.Client{
        Transport: &digest.Transport{
            Username: username,
            Password: password,
        },
    }

    resp, err := client.Get(uri)
    if err != nil {
        log.Fatal(err)
    }
    defer resp.Body.Close()

    log.Print("Coming here");
    if resp.StatusCode != http.StatusOK {
        log.Fatalf("Error: Status code %d", resp.StatusCode)
    } else {
        buffer := make([]byte, 4096) // Adjust the buffer size as needed

        for {
            n, err := resp.Body.Read(buffer)
            if err != nil && err != io.EOF {
                log.Fatal(err)
            }

            if n > 0 {
                // Process the chunk of data
                bodyString := string(buffer[:n])
                log.Print(bodyString)
            }

            if err == io.EOF {
                break
            }
        }
    }
}
Copier après la connexion

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!

source:stackoverflow.com
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal