基于https://gist.github.com/nfriedly/0240e862901474a9447a600e5795d500上的示例, 我正在尝试使用WebSocket使用IBM Speech to Text API。 但是我在身份验证部分遇到了问题。 看来现在IBM不再提供用户名/密码。 只有api键。
所以我找不到添加该示例以使用api获取令牌的方法。
有人知道如何将WebSocket与IBM apikey一起使用进行身份验证吗? IBM文档似乎也不是最新的,因为他们的示例正在使用带有用户名和密码https://console.bluemix.net/docs/services/speech-to-text/getting-started.html#getting-started-tutorial
的CURL我什至看到某个地方可以用apikey将用户名替换为“ api”和密码。 但这不起作用,因为我从服务器收到未经授权的错误。
也许我读错了,应该传递令牌而不是密码。 但是,如何使用websockets从我的APIkey获取令牌?
我可以使用HttpClient毫无问题地获得令牌。 但是看来之后我无法再将该令牌与Websocket一起使用,只能再进行HttpClient调用。
答案 0 :(得分:1)
在一些帮助下,我终于找到了如何使用apiKey处理WebSocket。
如果有人需要,我会在这里发布代码
IamTokenData GetIAMToken(string apikey)
{
var wr = (HttpWebRequest)WebRequest.Create("https://iam.bluemix.net/identity/token");
wr.Proxy = null;
wr.Method = "POST";
wr.Accept = "application/json";
wr.ContentType = "application/x-www-form-urlencoded";
using (TextWriter tw = new StreamWriter(wr.GetRequestStream()))
{
tw.Write($"grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey={apikey}");
}
var resp = wr.GetResponse();
using (TextReader tr = new StreamReader(resp.GetResponseStream()))
{
var s = tr.ReadToEnd();
return JsonConvert.DeserializeObject<IamTokenData>(s);
}
}
IamTokenData tokenData = GetIAMToken([Your IamApiKey]);
CancellationTokenSource cts = new CancellationTokenSource();
ClientWebSocket clientWebSocket = new ClientWebSocket();
clientWebSocket.Options.Proxy = null;
clientWebSocket.Options.SetRequestHeader("Authorization", $"Bearer {token.AccessToken}");
// Make the sure the following URL is that one IBM pointed you to
Uri connection = new Uri($"wss://gateway-wdc.watsonplatform.net/speech-to-text/api/v1/recognize");
try
{
//await clientWebSocket.ConnectAsync(connection, cts.Token);
clientWebSocket.ConnectAsync(connection, cts.Token).GetAwaiter().GetResult();
Console.WriteLine("Connected!");
}
catch (Exception e)
{
Console.WriteLine("Failed to connect: " + e.ToString());
return null;
}
// ... Do what you need with the websocket after that ...