2017-02-13 25 views
-1

我無法使用文本翻譯API獲取語言名稱。我得到的可用語言用這種方法:如何通過GetLanguageNames使用文本翻譯API獲取語言名稱

public async Task<List<string>> GetLanguagesForTranslateAsync() 
{ 
    string requestUri = "https://api.microsofttranslator.com/v2/http.svc/GetLanguagesForTranslate"; 
    string accessToken = await this.auth.GetTokenAsync(); 
    string response = await this.GetAsync(requestUri, accessToken); 
    XDocument xml = XDocument.Parse(response); 
    List<string> languages = new List<string>(); 
    foreach (XElement element in xml.Root.Descendants()) 
    { 
     languages.Add(element.Value); 
    } 
    return languages; 
} 

private async Task<string> GetAsync(string url, string bearerToken) 
{ 
    using (HttpClient httpClient = new HttpClient()) 
    { 
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken); 
     HttpResponseMessage response = await httpClient.GetAsync(url); 
     return await response.Content.ReadAsStringAsync(); 
    } 
} 

我這種情況下,我得到像「EN」,「ES」,「FR」或「ZH-CHT」語言代碼的XML,但我想「英語」,「西班牙語」,「法語」或「中國(傳統)」。展望the documentation這個方法我試過:

public async Task<List<string>> GetLanguageNamesAsync(string locale, List<string> languageCodes) 
{ 
    string requestUri = "https://api.microsofttranslator.com/v2/http.svc/GetLanguageNames"; 
    string content = $"locale=en&languageCodes=en,es,fr,zh-CHT"; 
    string accessToken = await this.auth.GetTokenAsync(); 
    string response = await this.PostAsync(requestUri, accessToken, content); 
    XDocument xml = XDocument.Parse(response); 
    List<string> languages = new List<string>(); 
    foreach (XElement element in xml.Root.Descendants()) 
    { 
     languages.Add(element.Value); 
    } 
    return languages; 
} 

private async Task<string> PostAsync(string url, string bearerToken, string content) 
{ 
    using (HttpClient httpClient = new HttpClient()) 
    { 
     httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", bearerToken); 
     HttpResponseMessage response = await httpClient.PostAsync(url, new StringContent(content)); 
     return await response.Content.ReadAsStringAsync(); 
    } 
} 

我這個請求得到響應:

請求錯誤

錯誤狀態代碼: 'InternalServerError'

詳情:的服務器在處理請求時遇到錯誤。請參閱服務器日誌以獲取更多詳細信息。

真正的XML響應:

<html version="-//W3C//DTD XHTML 2.0//EN" 
     xml:lang="en" 
     xsi:schemaLocation="http://www.w3.org/1999/xhtml http://www.w3.org/MarkUp/SCHEMA/xhtml2.xsd" 
     xmlns="http://www.w3.org/1999/xhtml" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 
    <HEAD> 
    <TITLE>Request Error</TITLE> 
    </HEAD> 
    <BODY> 
    <DIV id="content"> 
     <P class="heading1"><B>Error Status Code:</B> 'InternalServerError'</P> 
     <P><B>Details: </B>The server encountered an error processing the request. Please see the server logs for more details.</P> 
     <!-- Padding xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx--> 
    </DIV> 
    </BODY> 
</html> 

你知道發生了什麼事?還有什麼我需要能夠提出請求嗎?

回答

1

確保您可以捲曲GetLanguages。以下對我有用。

curl -k --data "" "https://api.cognitive.microsoft.com/sts/v1.0/issueToken" -H "Ocp-Apim-Subscription-Key:<your Translation Text Key>" > Bearer.txt 
set /p Bearer= < Bearer.txt 
curl -H "Authorization: Bearer %Bearer%" "https://api.microsofttranslator.com/v1/http.svc/GetLanguageNames" 
curl -H "Authorization: Bearer %Bearer%" "https://api.microsofttranslator.com/v2/http.svc/GetLanguagesForTranslate" 
curl -H "Authorization: Bearer %Bearer%" "https://api.microsofttranslator.com/v2/Http.svc/Translate?Text=Hello%%20world.&From=en&To=es" 
+0

感謝您的幫助,但我迷路了,我想用C#這樣做,但是你的答案似乎是控制檯的命令,但我不知道。也許你可以給我更多關於如何使用這些命令的細節。我沒有GetLanguagesForTranslate和使用C#翻譯的問題,但我確實有GetLanguageNames。 – Jon

+1

學習使用'curl'來驗證API的正確調用。你的問題與C#無關。如果你已經通過使用'curl'消除了C#來簡化了這個問題,那麼你會在幾分鐘內找到解決方案,至少我在幾分鐘內發現了你的問題。問題是'GetLanguageNames'不是一個v2 API調用。它只是v1。你的端點是錯誤的。 – BSalita

+0

'curl'非常適合尋找這樣的問題。微軟和其他API提供商應該爲他們的每個API顯示'curl'命令。這將節省很多時間。不幸的是,微軟認知通常不會顯示「curl」命令,但是當他們這樣做時,他們是錯誤的。如果我在文檔中沒有看到'curl'命令,我立即懷疑這個API不能像記錄那樣工作。 – BSalita