C#中的IBM Watson Tone Analyzer API调用

时间:2019-02-17 02:57:53

标签: c# api ibm-cloud ibm-watson

我试图在C#中编写对Watson音调分析器服务的后期API调用。似乎验证用户身份的方法最近已从用户名和密码更改为api密钥。

我试图通过“ Authorization”标头或称为“ apikey”的标头传递apikey。在两种情况下,我都收到错误401 Unauthorized。。我使用的另一个标头是将Content-Type设置为application / json ..

此调用在.net项目或邮递员中均无效。

如何使用C#发送API请求,如何通过shell传递api密钥以及应使用哪些标头?

这是我尝试的代码(此代码返回内部服务器错误500的错误,而我对邮递员所做的测试返回401未经授权):

   HttpClient client = new HttpClient();
    string baseURL;
    string apikey= "****************"; 

    baseURL = "https://gateway-lon.watsonplatform.net/tone-analyzer/api/v3/tone?version=2017-09-21";



string postData = "{\"text\": \"" + "hi hello" + "\"}";

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("apikey", apikey);

var response = client.PostAsync(baseURL, new StringContent(postData, Encoding.UTF8, "application/json")).Result;

Console.WriteLine(response);

我收到的错误:

StatusCode: 500, ReasonPhrase: 'Internal Server Error', Version: 1.1, Content: System.Net.Http.StreamContent, Headers:
{
  Mime-Version: 1.0
  Connection: close
  Date: Sun, 17 Feb 2019 11:37:53 GMT
  Server: AkamaiGHost
  Content-Length: 177
  Content-Type: text/html
  Expires: Sun, 17 Feb 2019 11:37:53 GMT
}

1 个答案:

答案 0 :(得分:1)

为此,您需要执行适当的基本授权(请参见https://cloud.ibm.com/apidocs/tone-analyzer的“授权”部分)。根据{{​​3}},基本授权意味着授权方案为Basic,授权参数为Base64编码的username:password。

client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("apikey:" + apikey)));

以下代码对我有用:

HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(Encoding.ASCII.GetBytes("apikey:" + apikey)));

string postData = "{\"text\": \"" + "I am happy it finally worked" + "\"}";
var response = client.PostAsync("https://gateway-lon.watsonplatform.net/tone-analyzer/api/v3/tone?version=2017-09-21", new StringContent(postData, Encoding.UTF8, "application/json")).Result;
var responseContent = response.Content.ReadAsStringAsync().Result;

哪个返回了{"document_tone":{"tones":[{"score":0.956143,"tone_id":"joy","tone_name":"Joy"},{"score":0.620279,"tone_id":"analytical","tone_name":"Analytical"}]}}

作为旁注,我最初使用了法兰克福网关( gateway-fra ),当我在伦敦网关( gateway-lon )上使用此网关的apikey时)我还收到服务器错误500(内部服务器错误)。对于其他网关,我收到错误401(未经授权),因为apikey似乎是针对每个服务和网关/位置的。删除我的ToneAnalyzer服务并这次为伦敦网关设置了新服务后,它就起作用了。因此,我猜想,当您将apikey用于另一个网关上的一个网关时,他们正在使用的IBM授权服务器或Akamai负载均衡器有点奇怪。