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