IBM Watson Tone Analyzer API 在 C# 中调用

IBM Watson Tone Analyzer API call in C#

我试图用 C# 编写一个 post API 对 watson tone analyzer 服务的调用。似乎验证用户的方式最近从用户名和密码更改为 api 密钥。

我试图通过 "Authorization" header 或通过名为 "apikey" 的 header 传递 api 密钥。在这两种情况下我都收到了错误 401 未经授权.. 我使用的另一个 header 是 Content-Type 设置为 application/json..

此调用在 .net 项目和 postman 中均无效。

如何使用 C# 发送 API 请求,shell 我如何传递 api 密钥,我应该使用什么 header?

这是我试过的代码(此代码returns内部服务器错误500的错误,而我用postman returns 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
}

为此,您需要进行适当的基本授权(请参阅 https://cloud.ibm.com/apidocs/tone-analyzer). According to RFC 7617 中的授权部分,基本授权意味着授权方案为 Basic,授权参数为 username:password Base64编码。

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),当我在伦敦网关上使用此网关的 apikey ( gateway-lon) 我还收到服务器错误 500(内部服务器错误)。对于其他网关,我收到错误 401(未授权),因为 apikeys 似乎是每个服务和 gateway/location。这次我删除了 ToneAnalyzer 服务并为伦敦网关设置了一个新服务后,它就起作用了。所以我想,当您在另一个网关上为一个网关使用 apikey 时,IBM 的授权服务器或他们使用的 Akamai 负载平衡器有点不稳定。