websocket 服務已經是非常熟悉的東西了,但是今天仍然被一個問題困了很久。
主要是在Websocket 跨域的問題上。
今天在本地用golang的官方包寫了一個簡單的websocket server,寫完後通過瀏覽器執行js的方式測試OK,然後打算把flutter也接上。
可是在flutter上通過 WebSocket.connect的時候,一直提示錯誤。
WebSocketException: Connection to 'http://127.0.0.1:9998/ws#' was not upgraded to websocket
在檢查了flutter中的websocket的發起請求和配置多次後,開始通過charles抓包,發現http請求是成功的,但是upgrade失敗了,http狀態碼是403。
可是golang的webserver 沒有更多的錯誤提示,在對比了Flutter和 browser 發起的request後,發現Flutter的request header缺少了 Origin參數, 而 Origin 是標識請求所在域的參數,考慮可能是跨域問題,在Flutter 中增加 header 參數Origin後則請求正常。
除此之外,目前沒有發現在golang server中對websocket response header設置的方法。