Mtgox
MtGox websockets api 返回“400 錯誤請求”
我想開始使用 Mt. Gox websockets API,但我似乎無法從伺服器獲得良好的響應。
我正在發送以下內容(使用 Wireshark 擷取):
GET /mtgox HTTP/1.1 User-Agent: websocket-sharp/1.0 Upgrade: websocket Connection: Upgrade Host: websocket.mtgox.com Sec-WebSocket-Key: LtH+YFgnW1N8KDLDbocsUQ== Sec-WebSocket-Version: 13
伺服器響應:
HTTP/1.1 400 Bad Request
我已嘗試通過 telnet 和此 C# 程式碼發送握手,但仍然收到 400 Bad Request 錯誤:
class Program { static void Main(string[] args) { ClientWebSocket ws = new ClientWebSocket(); Task connectionTask = ws.ConnectAsync(new Uri("ws://websocket.mtgox.com/mtgox"), CancellationToken.None); Console.Write("Connecting"); while (!connectionTask.IsCompleted) { Console.Write("."); Thread.Sleep(100); } Console.WriteLine(ws.State); } }
(列印的最後一行是“Closed”,當我檢查與 Wireshark 的握手時,我看到相同的 400 Bad Request)
任何想法我做錯了什麼?我看不到太多使用 websockets API 的文件或範例,所以我真的沒有什麼可比較的:(
為了回應 sta 的建議,我嘗試了這個(使用 WebsocketSharp):
static void Main(string[] args) { WebSocket ws = new WebSocket("ws://websocket.mtgox.com/mtgox"); ws.Origin = "http://websocket.mtgox.com"; ws.Connect(); ws.OnMessage += (sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { Console.WriteLine("{0}", e.Data); } }; Console.WriteLine("{0}", ws.IsAlive); Console.ReadLine(); }
這顯示
FALSE
所以我仍然做錯了:/我還沒有機會深入研究 WebSocketSharp更新:使用 WebsocketSharp 正確設置 Origin 標頭,Wireshark 顯示 mtgox 伺服器接受 websocket 升級:
HTTP/1.1 101 Switching Protocols\r\n Upgrade: websocket\r\n Connection: Upgrade\r\n Sec-WebSocket-Accept: 2+1ghzJ/Itt6w1aBdUteghcsJHk=\r\n \r\n
但是 WebSocketSharp 仍然報告連接已關閉:(
似乎客戶端應該在打開握手時將 Origin 標頭髮送到 MtGox 伺服器。
如果您使用目前的 websocket-sharp,您應該在連接之前執行以下操作。
ws.Origin = "<http://websocket.mtgox.com>";
你能試試嗎?
更新:
你能再試試下面的程式碼嗎?
static void Main(string[] args) { var ws = new WebSocket("ws://websocket.mtgox.com/mtgox?Currency=USD"); ws.Origin = "http://websocket.mtgox.com"; ws.OnOpen += (sender, e) => { ws.Send( @"{ ""op"": ""unsubscribe"", ""channel"": ""d5f06780-30a8-4a48-a2f8-7ed181b4a13f"" }" ); }; ws.OnMessage += (sender, e) => { if (!String.IsNullOrEmpty(e.Data)) { Console.WriteLine("{0}", e.Data); } }; ws.Connect(); Console.ReadLine(); ws.Close(); }
當客戶端在一段時間內接收到ticker類型數據時,似乎發生了異常。
我會進一步調查。
更新:
我已經找到了異常的原因,並修復了 websocket-sharp。
你能用目前的 websocket-sharp 試試你的程式碼嗎?