Heim  >  Artikel  >  Backend-Entwicklung  >  Wie stelle ich einen Leserückruf für eine Net/http-GET-Anfrage ein, beispielsweise mit go-curl?

Wie stelle ich einen Leserückruf für eine Net/http-GET-Anfrage ein, beispielsweise mit go-curl?

WBOY
WBOYnach vorne
2024-02-11 09:24:08307Durchsuche

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

Der PHP-Editor Xigua zeigt Ihnen, wie Sie Leserückrufe für Net/http-GET-Anfragen festlegen, um ähnliche Funktionen wie go-curl zu erreichen. Wenn wir die net/http-Bibliothek verwenden, um eine GET-Anfrage zu initiieren, können wir die zugehörigen Methoden der Strukturen http.Client und http.Request verwenden, um die Leserückruffunktion festzulegen. Indem wir den Wert von http.Response.Body auf eine benutzerdefinierte Struktur setzen, die die io.Reader-Schnittstelle implementiert, können wir Rückrufvorgänge ausführen, während wir den Antwortinhalt lesen. Auf diese Weise können wir flexiblere und individuellere Abläufe bei der Verarbeitung von HTTP-Anfragen erreichen und so die Wartbarkeit und Skalierbarkeit des Codes verbessern.

Frageninhalt

Wir haben ein funktionierendes Golang-Programm, das Schnappschüsse/Bilder von Dahua-Kameras abrufen kann. Wir möchten dies verbessern, indem wir eine Leserückruffunktion für den folgenden URI hinzufügen: http://192.168.x.x/cgi-bin/eventManager.cgi?action=attach&codes=[VideoMotion]. Dieser URI hält den Socket von der Kameraseite aus offen, über den die Kamera kontinuierlich Ereignisse sendet.

Wir haben versucht, go-curl zu verwenden, da es die Registrierung von Leserückrufen unterstützt. Dieses Paket unterstützt jedoch nicht die MIPS-Architektur. Daher können wir es nicht verwenden. Jeder Rat/Hilfe wäre hilfreich. Hier ist der Arbeitscode für den Snapshot-Abruf.

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
}

Workaround

Es war mein Missverständnis, dass der client.Get(uri)-Anruf blockiert wurde. Der folgende Kommentar von @kotix hat mich dazu gebracht, meinen Code zu überdenken. Nachdem Sie unter client.Get(uri) den Ausdruck hinzugefügt haben, bestätigen Sie, um mit der Ausführung fortzufahren.

Dies ist der vollständige Code zum Ausdrucken eines Ereignisses, wenn es eintrifft.

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

Das obige ist der detaillierte Inhalt vonWie stelle ich einen Leserückruf für eine Net/http-GET-Anfrage ein, beispielsweise mit go-curl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:stackoverflow.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen