Я пытаюсь вызвать API IBM Watson для выполнения анализа настроений из моего проекта Unity с использованием библиотеки WWW. Это мой текущий код:

string uri = "https://gateway.watsonplatform.net/natural-language-understanding/api/v1/analyze?version=2017-02-27";

WWWForm form = new WWWForm();
form.AddField ("text", "That%20was%20simply%20magnificent!");
form.AddField ("features", "sentiment");
form.AddField ("Content-Type", "application/json");
var headers = form.headers;
byte[] rawData = form.data;

headers["Authorization"] = "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(USERNAME + ":" + PASSWORD));

WWW www = new WWW(uri, rawData, headers);
yield return www;

Где USERNAME и PASSWORD - мои учетные данные API. Однако этот код продолжает выдавать ошибку 415. Кроме того, если я изменю авторизацию на аутентификацию, ошибка изменится на 401.

Я пробовал сделать тот же запрос с помощью hurl.it (который работает), распечатал заголовок авторизации и сравнил его с тем, что строит hurl.it с указанием имени пользователя и пароля, и это одна и та же строка - но все же запрос не выполняется в проекте. Что мне не хватает?

0
Technicolor 31 Дек 2017 в 18:32

2 ответа

Лучший ответ

Это должно сработать для вас.

private IEnumerator CallNLU()
{
    string uri = "https://gateway.watsonplatform.net/natural-language-understanding/api/v1/analyze?version=2017-02-27";

    var headersDict = new Dictionary<string, string>();
    headersDict.Add("Content-Type", "application/json");
    headersDict.Add("Accept", "application/json");
    headersDict.Add("Authorization", "Basic " + System.Convert.ToBase64String(System.Text.Encoding.ASCII.GetBytes(USERNAME + ":" + PASSWORD)));

    string parameters = "{\"text\": \"Hello, welcome to IBM Watson!\", \"features\": {\"keywords\":{\"limit\":50}}}";
    byte[] rawData = Encoding.UTF8.GetBytes(parameters);

    WWW www = new WWW(uri, rawData, headersDict);
    yield return www;
    Debug.Log(www.text);
}

В качестве альтернативы используйте Watson Unity SDK, который можно найти здесь. Вот использование .

private void Analyze()
{
  if (!_naturalLanguageUnderstanding.Analyze(OnAnalyze, OnFail, <parameters>))
      Log.Debug("ExampleNaturalLanguageUnderstanding.Analyze()", "Failed to get models.");
}

private void OnAnalyze(AnalysisResults resp, Dictionary<string, object> customData)
{
    Log.Debug("ExampleNaturalLanguageUnderstanding.OnAnalyze()", "AnalysisResults: {0}", customData["json"].ToString());
}
1
taj 2 Янв 2018 в 19:56

Вы должны добавить правильный тип носителя в WWWForm следующим образом:

form.AddField("Content-Type", "application/x-www-form-urlencoded");

Вы должны проверить документ Watson, чтобы узнать, какой из них правильный, я полагаю, это будет Json

0
TheOni 31 Дек 2017 в 15:39