首頁 > 後端開發 > Golang > 主體

如何像使用 go-curl 一樣為 net/http GET 請求設定讀取回呼?

WBOY
發布: 2024-02-11 09:24:08
轉載
371 人瀏覽過

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

php小編西瓜為您介紹如何為net/http GET請求設定讀取回調,實現類似go-curl的功能。在使用net/http函式庫發起GET請求時,我們可以利用http.Client和http.Request結構體的相關方法來設定讀取回呼函數。透過設定http.Response.Body的值為一個實作了io.Reader介面的自訂結構體,我們可以在讀取回應內容的同時執行回呼操作。這樣,我們就能夠在處理HTTP請求的過程中實現更靈活且自訂的操作,提升程式碼的可維護性和擴充性。

問題內容

我們有一個有效的 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
}
登入後複製

解決方法

這是我的誤解,認為 client.Get(uri) 呼叫被阻止。 @kotix 的以下評論讓我重新思考程式碼。在client.Get(uri)下方新增列印後,確認繼續執行。

這是在事件到達時列印事件的完整程式碼。

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
            }
        }
    }
}
登入後複製

以上是如何像使用 go-curl 一樣為 net/http GET 請求設定讀取回呼?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:stackoverflow.com
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板