在使用 websockets 时,我可以在发送查询字符串时传入标头吗?

Posted

技术标签:

【中文标题】在使用 websockets 时,我可以在发送查询字符串时传入标头吗?【英文标题】:While working with websockets can I pass in a header when sending a query string? 【发布时间】:2019-10-28 15:33:35 【问题描述】:

我目前正在使用 WebSocket4Net 在 xamarin 中工作以连接到 GraphQL 服务器。现在我试图通过套接字发送一个查询字符串,但我收到一条错误消息,说没有“作为用户身份验证”。我得到这个是因为我必须将一个令牌传递到标题中,但是我还没有正确地做到这一点。

我尝试在第一次建立连接时添加自定义标头,但这似乎没有什么不同。发送查询字符串时有没有办法设置标题?

我已经在我的 GraphQL 操场上运行它,但我的代码中还没有正确使用它。

这就是我初始化套接字的方式,您可以看到我尝试在此处添加自定义标头,但这并没有什么不同。

public void Init(string Uri)
        
            //Initialize the socket
            try
            
                var cookies = new List<KeyValuePair<string, string>>();
                var extension = new List<KeyValuePair<string, string>>();
                extension.Add(new KeyValuePair<string, string>("x-token", AuthenticationAPI.CurrentToken.ToString()));
                sock = new WebSocket(Uri, "graphql-ws", customHeaderItems:extension);
                sock.Opened += (sender, data) =>  OnConnect(data); ;
                sock.MessageReceived += (sender, data) =>  OnMessage(data); ;
                sock.Closed += (sender, data) =>  OnDisconnect(data); ;
            
            catch (Exception ex)
            
                //Init failed 
                sock = null;
                isConnected = false;
            
        

然后我尝试在此处发送我的查询字符串,但收到一条错误消息“未作为用户身份验证”

var variables = new Variables();
string entryDate = string.Format("0:yyyy-MM-dd", i.ActionDateTime);
var query = "mutation logAction(episodeId: " + i.EpisodeId + ", listen: " + listenedTo + ") episodeId listen position favorite entryDate"; //  + ", position: " + i.PlayerTime + ", favorite: " + i.Favorite.ToString().ToLower()
var payload = new WebSocketHelper.Payload(query, variables);
var JsonIn = JsonConvert.SerializeObject(new WebSocketCommunication("start", payload));
                                
DabSyncService.Instance.Send(JsonIn);

我已经尝试了一周左右的时间,如果有人能指出我正确的方向,那就太棒了。谢谢!

【问题讨论】:

您使用 Websockets 来查询我认为的 GraphQL API 是否有特定原因? 我们想要即时通讯。这不是我的决定。 但是你使用的api是否完全支持它?看起来您在场景中遇到了类似 HTTP 的错误 我相信是这样,但我可以仔细检查一下。 我的类序列化被搞砸了,因为它有一个破折号。一旦我应用了属性 [Newtonsoft.Json.JsonProperty(PropertyName = "x-token")] 一切正常。不过我可能会删除这个问题,因为这只是一个愚蠢的错误。 【参考方案1】:

我的类序列化被搞砸了,因为它有一个破折号。一旦我应用了属性 [Newtonsoft.Json.JsonProperty(PropertyName = "x-token")] 一切正常。

https://code-examples.net/en/q/e11d59

【讨论】:

以上是关于在使用 websockets 时,我可以在发送查询字符串时传入标头吗?的主要内容,如果未能解决你的问题,请参考以下文章

等待通过 websocket 的承诺

在 Python FastAPI 中使用 websocket 并行发送/接收

IIS WebSocket Ping pong 非空闲时发送

使用WebSocket实现服务端和客户端的通信

查询 websocket 服务器中的数据库

WebSocket 在发送时关闭