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

dy1byipe  于 11个月前  发布在  Go
关注(0)|答案(1)|浏览(108)

我们有一个可以从大华相机中获取快照/图像的golang程序。我们想增强它,为下面的URI -http://192.168.x.x/cgi-bin/eventManager.cgi?action=attach&codes=[VideoMotion]添加读取回调函数。这个URI保持摄像机端的套接字打开,摄像机通过它发送事件。
我们尝试使用go-curl,因为它支持注册读取回调。但是,该软件包不支持MIPS架构。因此,我们无法使用它。任何建议/帮助都是有益的。这里是快照获取的工作代码。

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
}

字符串

uajslkp6

uajslkp61#

这是我的误解,客户端.Get(uri)调用被阻止。@kotix的以下评论让我重新思考代码。在客户端.Get(uri)下面添加打印后,确认执行继续。
好的,那么从resp.Body中阅读数据并检查resp字段而不是// Perform next steps注解有什么问题呢?
下面是在事件到达时打印事件的完整代码。

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

字符串

相关问题