【问题标题】:How to get language names using Text Translation API with GetLanguageNames如何使用带有 GetLanguageNames 的文本翻译 API 获取语言名称
【发布时间】:2017-02-13 12:41:47
【问题描述】:

我无法使用 Text Translation 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,但我想得到“english”、“spanish”、“french”或“中国传统的)”。看着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>

你知道发生了什么吗?我还需要什么其他东西才能提出请求吗?

【问题讨论】:

    标签: c# dotnet-httpclient microsoft-cognitive


    【解决方案1】:

    确保您可以 curl 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"
    

    【讨论】:

    • 感谢您的帮助,但我迷路了,我正在尝试使用 C# 来完成,但您的回答似乎是控制台命令,但我不确定。也许你可以给我更多关于如何使用这些命令的细节。 GetLanguagesForTranslate 和 Translate 使用 C# 没有问题,但 GetLanguageNames 确实有问题。
    • 学习使用curl 来验证API 的正确调用。您的问题与 C# 无关。如果您通过使用 curl 消除 C# 来简化问题,那么您会在几分钟内找到解决方案,至少我在几分钟内就找到了您的问题。问题是 GetLanguageNames 不是 v2 API 调用。它只是 v1。您的端点错误。
    • curl 非常适合发现此类问题。 Microsoft 和其他 API 提供商应为他们的每个 API 显示curl 命令。这会节省很多时间。不幸的是,Microsoft Cognitive 通常不显示curl 命令,但当它们显示时,它们就大错特错了。如果我在文档中没有看到 curl 命令,我会立即怀疑该 API 没有按照文档说明工作。
    • 再次感谢,我不知道微软为什么在 v1 中使用这个 API 调用。
    猜你喜欢
    • 2011-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多