Actualmente estoy creando una aplicación de chat distribuida. Todo funciona bien, lo que significa que es posible enviar mensajes entre los clientes y el servidor y transmitirlos adecuadamente.
Sin embargo, por el momento solo se envía el mensaje real al servidor. También me gustaría agregar información sobre el usuario que envía el mensaje.
Podría agregar esta información cada vez que envíe un mensaje nuevo, pero preferiría poder agregar esta información durante el protocolo de enlace inicial y luego guardar esta información en el backend.
He pensado en enviar cierta información en la URL, pero como solo instalo el websocket una vez, este no parece ser el camino a seguir. Del mismo modo, pensé en agregar la información como el cuerpo de la solicitud, pero leí que generalmente no se recomienda tener un cuerpo en una solicitud GET.
Entonces mi pregunta es, ¿estoy tratando de hacer algo que no debería hacer? ¿Debo simplemente enviar información sobre el cliente en cada nuevo mensaje que se envía al servidor?
Actualmente, mi cliente se ve así:
const socket = new WebSocket("ws://localhost:8080/ws"); const connect = (cb) => { console.log("Attempting Connection...") socket.onopen = () => { console.log("Successfully Connected"); } socket.onmessage = (msg) => { console.log(msg) cb(msg); } socket.onclose = (event) => { console.log("Socket Closed Connection: ", event); } socket.onerror = (error) => { console.log("Socket Error: ", error); } }; const sendMsg = (msg) => { console.log("Sending msg: ", msg); socket.send(msg); }Y la conexión inicial en el backend es manejada por lo siguiente:
func serveWs(pool *websocket.Pool, w http.ResponseWriter, r *http.Request) { fmt.Println("WebSocket Endpoint Hit") conn, err := websocket.Upgrade(w, r) if err != nil { fmt.Fprintf(w, "%+V\n", err) } client := &websocket.Client{ Name: "?????", // Obviously, I would like the actual name to be here. Conn: conn, Pool: pool, } pool.Register <- client client.Read() }Lo normal que se debe hacer aquí, como señaló Selbie , es esperar del cliente un primer mensaje especial a través de WebSocket. Si ese mensaje no se recibe o no cumple con los requisitos, el servidor finaliza la conexión WebSocket.
Usar socket.onopen es muy común para esta tarea.
Más información sobre por qué no puede colocar encabezados: encabezados HTTP en la API del cliente de Websockets