2017-02-13 16 views
-1

Я не могу получить имена языков, используя Text Translation API. Я получаю список доступных языков с помощью этого метода:Как получить имена языков с помощью API перевода текста с помощью GetLanguageNames

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

Я этот случай я получаю XML с кодами языков, таких как «ан», «эс», «фр» или «ZH-CHT», но я хочу, чтобы получить «английский», «испанский», «французский» или «китайский (традиционный)». Глядя 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(); 
    } 
} 

Ответ Я получаю этот запрос:

Запрос об ошибке

Error Status Code: '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 и Translate, используя C#, но у меня есть с GetLanguageNames. – Jon

+1

Научитесь использовать 'curl' для проверки правильного вызова API. Ваша проблема не связана с C#. Если вы упростили проблему, исключив C# с помощью 'curl', вы бы нашли решение за считанные минуты, по крайней мере, я нашел вашу проблему за считанные минуты. Проблема заключается в том, что 'GetLanguageNames' не является вызовом API v2. Это только v1. Ваша конечная точка неверна. – BSalita

+0

'curl' отлично подходит для поиска таких проблем. Microsoft и другие поставщики API должны показывать команды 'curl' для каждого из своих API. Это сэкономит много времени. К сожалению, Microsoft Cognitive часто не показывает команду 'curl', но когда они это делают, они плохо ошибаются. Если я не вижу в документации документа 'curl', я сразу же подозреваю, что API не работает так документирован. – BSalita