Maison  >  Article  >  développement back-end  >  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
WBOYavant
2024-02-11 09:24:08308parcourir

如何像使用 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
}

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

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:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer