Tutorials

HTTP Requests

Make HTTP requests from your Bubble Tea application.

TUIs that talk to the internet? Absolutely!

The Complete Code

package main

import (
    "fmt"
    "log"
    "net/http"
    "time"

    tea "github.com/charmbracelet/bubbletea/v2"
)

const url = "https://charm.sh/"

type model struct {
    status int
    err    error
}

type statusMsg int
type errMsg struct{ error }

func main() {
    p := tea.NewProgram(model{})
    if _, err := p.Run(); err != nil {
        log.Fatal(err)
    }
}

func (m model) Init() tea.Cmd {
    return checkServer
}

func (m model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
    switch msg := msg.(type) {
    case tea.KeyPressMsg:
        if msg.String() == "q" {
            return m, tea.Quit
        }
    case statusMsg:
        m.status = int(msg)
        return m, tea.Quit
    case errMsg:
        m.err = msg
    }
    return m, nil
}

func (m model) View() string {
    s := fmt.Sprintf("Checking %s...", url)
    if m.err != nil {
        s += fmt.Sprintf(" error: %s", m.err)
    } else if m.status != 0 {
        s += fmt.Sprintf(" %d %s", m.status, http.StatusText(m.status))
    }
    return s + "\n"
}

func checkServer() tea.Msg {
    c := &http.Client{Timeout: 10 * time.Second}
    res, err := c.Get(url)
    if err != nil {
        return errMsg{err}
    }
    defer res.Body.Close()
    return statusMsg(res.StatusCode)
}

The Key Pattern

Commands run in goroutines and return messages when done!