Вызов API IBM Watson Tone Analyzer в C # - PullRequest
       6

Вызов API IBM Watson Tone Analyzer в C #

0 голосов
/ 17 февраля 2019

Я пытался написать пост API-вызов в службу анализа тона watson в C #.Кажется, что способ аутентификации пользователя был недавно изменен с имени пользователя и пароля на ключ API.

Я пытался передать apikey через заголовок «Authorization» или через заголовок «apikey». В обоих случаях я получил ошибку 401 Unauthorized. Другой используемый мной заголовок - наборы Content-Typeв application / json ..

Эти вызовы не работают ни в проекте .net, ни в почтальоне.

Как я могу отправить запрос API с использованием C #, как в оболочке я передаю ключ APIи какие заголовки мне следует использовать?

Это код, который я пробовал (этот код возвращает ошибку внутренней ошибки сервера 500, в то время как тесты, которые я делал с почтальоном, возвращают 401 Unauthorized):

   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 голосов
/ 19 февраля 2019

Для того, чтобы это работало, вам необходимо выполнить правильную базовую авторизацию (см. Раздел «Авторизация» на https://cloud.ibm.com/apidocs/tone-analyzer). Согласно RFC 7617 базовая авторизация означает, что схема авторизации Basic и параметр авторизацииэто имя пользователя: пароль в кодировке 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 относятся к службе и шлюзу / местоположению. После того, как я удалил службу ToneAnalyzer и настроил новую на этот раз для лондонского шлюза, она заработала.Я полагаю, сервер авторизации IBM или балансировщик нагрузки Akamai, который они используют, немного неудобен, когда вы используете apikey для одного шлюза на другом компьютере.Eway.

...