Maison > développement back-end > Golang > allez htmx et sse exemple

allez htmx et sse exemple

WBOY
Libérer: 2024-08-28 06:34:33
original
1040 Les gens l'ont consulté

go htmx and sse example

Cet exemple montre comment remplacer quelques blocs sur un événement, par exemple "post avec l'identifiant 1 modifié" ( post-1-changed ) et déclencher le chargement du contenu via une requête ajax sur "chatter" événement.

package main

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

    "github.com/r3labs/sse/v2"
)

func main() {
    server := sse.New()
    _ = server.CreateStream("messages")

    mux := http.NewServeMux()
    mux.HandleFunc("/events", func(w http.ResponseWriter, r *http.Request) {

        // la security
        token := r.URL.Query().Get("token")
        if token != "secret" {
            http.Error(w, "invalid token", http.StatusUnauthorized)
            return
        }
        go func() {
            <-r.Context().Done()
            println("The client is disconnected here")
            return
        }()

        server.ServeHTTP(w, r)
    })

    mux.HandleFunc("/chatroom", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte(`<div>Hello from chat room</div>`))
    })

    mux.HandleFunc("/index", func(w http.ResponseWriter, r *http.Request) {
        w.Write([]byte(`
        <html>
        <head>
        <script src="https://unpkg.com/htmx.org@2.0.2/dist/htmx.js"></script>
        <script src="https://unpkg.com/htmx-ext-sse@2.2.2/sse.js"></script>
        </head>
        <body hx-ext="sse" sse-connect="/events?stream=messages&token=secret">
        <div >
            <div sse-swap="post-1-changed">one</div>
        </div>
        <div>
            <div sse-swap="post-1-changed">one</div>
        </div>
        <div>
            <div sse-swap="post-1-changed">one</div>
        </div>
        <div>
            <div sse-swap="notifications">one</div>
        </div>
        <div>
            <div hx-get="/chatroom" hx-trigger="sse:chatter">
                chat body reloaded
            </div>
        </div>
        </body></html>
        `))
    })

    go func() {
        i := 0
        for {
            i++
            time.Sleep(1 * time.Second)

            server.TryPublish("messages", &sse.Event{
                ID:    []byte(fmt.Sprintf("%d", i)),
                Event: []byte("post-1-changed"),
                Data:  []byte(`<div>Hello from sse ` + fmt.Sprintf("%d", i) + `</div>`),
            })

            server.TryPublish("messages", &sse.Event{
                ID:    []byte(fmt.Sprintf("%d", i)),
                Event: []byte("notifications"),
                Data:  []byte(`<div>Hello from post 2 sse ` + fmt.Sprintf("%d", i) + `</div>`),
            })

            server.TryPublish("messages", &sse.Event{
                ID:    []byte(fmt.Sprintf("%d", i)),
                Event: []byte("chatter"),
                Data:  []byte(`<div></div>`),
            })
            server.EventTTL = 5 * time.Second
        }
    }()

    http.ListenAndServe(":9999", mux)
}


Copier après la connexion

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal