2017-12-31 151 views
0

Ich versuche, die IBM Watson-API aufzurufen, um eine Stimmungsanalyse von meinem Unity-Projekt mithilfe der WWW-Bibliothek durchzuführen. Dies ist mein aktueller Code:Kann externe API (IBM Watson) nicht in Unity C# über HTTP-Anforderung aufgerufen werden?

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; 

wo USERNAME und PASSWORD meine API-Anmeldeinformationen sind. Dieser Code gibt mir jedoch einen Fehler 415. Wenn ich Authorization to Authentication ändere, ändert sich der Fehler zu 401.

Ich habe versucht, die gleiche Anfrage mit hurl.it (was funktioniert), und ich habe die Autorisierung Header ausgedruckt und verglichen, was hurl.it konstruiert einen Benutzernamen und ein Passwort, und sie sind die gleiche Zeichenfolge - dennoch schlägt die Anfrage im Projekt fehl. Was vermisse ich?

+0

FYI Natural Language Understanding in der Watson Unity SDK abstrahiert: https://github.com/watson-developer-cloud/unity-sdk/blob/develop/Scripts/Services/NaturalLanguageUnderstanding/v1/NaturalLanguageUnderstanding. cs – taj

+0

UnityWebRequest System funktioniert für Sie? – jdnichollsc

+0

@jdnichollsc Ich endete mit dem SDK, das funktionierte. – Technicolor

Antwort

1

Dies sollte für Sie funktionieren.

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); 
} 

Alternativ können Sie auch das Watson Unity SDK here verwenden. Hier ist die usage.

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()); 
} 
0

Sie haben den richtigen Medientyp auf die WWWForm so hinzuzufügen:

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

Sie sollten Watson doc überprüfen, um zu sehen, welche die richtige ist, nehme ich es sein werde Json

+0

Aktualisierter Code - immer noch der gleiche Fehler? – Technicolor

+0

@Technicolor 401 oder 415? – TheOni

Verwandte Themen