亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

從 API 流式傳輸數據

從 API 流式傳輸數據

Go
MMMHUHU 2023-01-03 10:09:12
我正在嘗試從電子郵件測試工具 mailhog 中提取有關進入 API 的郵件數據。如果我使用調用來獲取電子郵件列表,例如 GET /api/v1/messages,我可以毫無問題地將這些數據加載到一個結構中,并打印出我需要的值。但是,如果我使用一個不同的端點,它本質上是一個新的電子郵件流,我會有不同的行為。當我運行我的 go 應用程序時,我沒有得到任何輸出。我是否需要像 while 循環一樣不斷地監聽端點以獲取輸出?我的最終目標是在電子郵件進入時從中提取一些信息,然后將它們傳遞給不同的功能。這是我嘗試訪問流式傳輸端點 https://github.com/mailhog/MailHog/blob/master/docs/APIv1.mdres, err := http.Get("http://localhost:8084/api/v1/events")if err != nil {    panic(err.Error())}body, err := ioutil.ReadAll(res.Body)if err != nil {    panic(err.Error())}var data Emailjson.Unmarshal(body, &data)fmt.Printf("Email: %v\n", data)如果我在具有相同端點的 mailhog 服務上執行 curl 請求,我會在收到郵件時得到輸出。但是我似乎無法弄清楚為什么我的 go 應用程序沒有得到任何輸出。該應用程序確實保持運行,只是我沒有得到任何輸出。如果這是一個非常簡單的問題,我是 Go 的新手,所以很抱歉
查看完整描述

1 回答

?
縹緲止盈

TA貢獻2041條經驗 獲得超4個贊

ioutil.ReadAll文檔:

ReadAll 從 r 讀取直到出現錯誤或 EOF 并返回它讀取的數據。

當您用來讀取常規端點的正文時,它會起作用,因為有效負載有一個EOF:服務器使用標頭來Content-Length告訴正文響應有多少字節,一旦客戶端讀取了那么多字節,它就會明白它已經讀取了全身上下都可以停下來。

但是,您的“流”端點沒有使用,因為正文的大小未知,它應該在事件到來時寫入事件,因此在這種情況下Content-Length您不能使用。ReadAll通常,在這種情況下,您應該逐行閱讀,其中每行代表一個事件。bufio.Scanner正是這樣做的:

res, err := http.Get("http://localhost:8084/api/v1/events")

if err != nil {

    panic(err.Error())

}

scanner := bufio.NewScanner(res.Body)

for e.scanner.Scan() {

    if err := e.scanner.Err(); err != nil {

        panic(err.Error())

    }

    event := e.scanner.Bytes()

    var data Email

    json.Unmarshal(event, &data)

    fmt.Printf("Email: %v\n", data)

}

curl可以按預期處理響應,因為它會檢查端點是否會流式傳輸數據,因此它會相應地做出反應。添加對問題的響應可能會有所幫助curl。


查看完整回答
反對 回復 2023-01-03
  • 1 回答
  • 0 關注
  • 102 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號