2017-02-13 4 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(); 
    } 
} 

I私は "EN"、 "ES"、 "FR" または "ZH-CHT" のような言語コードとXMLを取得するが、私は取得したいこの場合、 "英語"、 "スペイン語"、 "フランス語"または "中国語(伝統的)"のいずれかです。

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'

詳細:the documentationを見て、私はこの方法を試してみましたサーバーで要求の処理中にエラーが発生しました。詳細については、サーバーのログを参照してください。

実際の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

APIの適切な呼び出しを確認するために 'curl'を使う方法を学んでください。あなたの問題はC#とは無関係です。 'curl'を使用してC#を削除して問題を簡素化した場合は、分単位で解決策が見つかるはずです。問題は 'GetLanguageNames'がv2 API呼び出しではないことです。それはv1だけです。エンドポイントが間違っています。 – BSalita

+0

'curl'はこのような問題を見つけるのに最適です。 Microsoftやその他のAPIプロバイダは、それぞれのAPIに対して 'curl'コマンドを表示する必要があります。それは多くの時間を節約します。残念なことにMicrosoft Cognitiveはcurlコマンドを表示しないことがよくありますが、そうしたときに間違っています。ドキュメントに 'curl'コマンドが表示されない場合は、APIが文書化されているように機能しないことはすぐに疑わしいです。 – BSalita

関連する問題