【问题标题】:Issue with azure cognitive translation servicesazure 认知翻译服务的问题
【发布时间】:2017-10-30 12:09:48
【问题描述】:

在让以下代码可靠地工作了一个月左右后,它在几天前就停止了可靠地工作。大约一半的时间返回正确翻译的字符串,另一半的时间返回以下两条消息之一:

java.io.FileNotFoundException: https://api.cognitive.microsoft.com/sts/v1.0/issueToken

java.net.UnknownHostException:无法解析主机 “api.microsofttranslator.com”:没有与主机名关联的地址

此问题开始的时间恰逢我的免费 azure 认知服务帐户到期,但我昨天迁移到现收现付帐户,问题仍然存在。

为什么会这样?

static class translateMessageX extends AsyncTask<String, Void, String>
{
    //input string array of 3 items
    //[0]is the message to be translated
    //[1]is the from language i.e. "english"
    //[2]is the to language i.e. "spanish"
    //[3]"echo" or "received"
    String retString;
    String inString = null;
    String messageType = null;
    String URLHolder = "";  //hold the URL here while we are translating the text
    @Override
    protected String doInBackground(String... params)
    {
        inString = params[0];
        String from = params[1];
        String to = params[2];
        messageType = params[3];
        int urlStart = inString.indexOf("http");
        if (!(urlStart == -1))
        {
            URLHolder = inString.substring(urlStart);
            inString = inString.substring(0, urlStart -1);
        }
        else
        {
            URLHolder = "";
        }


        Integer mesChars = params[0].length();
        Integer tCharsLeft = GlobalStuff.getTranslationsFromSP();
        if (tCharsLeft > 0)
        {
            if (tCharsLeft < mesChars)  //we charge for both 'echo' and 'received' translations
            {
                GlobalStuff.updateTranslationInventory(tCharsLeft * -1);
            }
            else
            {
                GlobalStuff.updateTranslationInventory(mesChars * -1);
            }
            GlobalStuff.notifyListeners(this, "#uui", "notused", "notused" );
            try
            {

                Language fromLang = GlobalStuff.getLang(from);
                Language toLang = GlobalStuff.getLang(to);

                //retString = Translate.execute(inString, fromLang, toLang);
                //String debugstr = "look at retStr";
                String authenticationUrl = "https://api.cognitive.microsoft.com/sts/v1.0/issueToken";
                HttpsURLConnection authConn = (HttpsURLConnection) new URL(authenticationUrl).openConnection();
                authConn.setRequestMethod("POST");
                authConn.setDoOutput(true);
                authConn.setRequestProperty("Ocp-Apim-Subscription-Key", GlobalStuff.translateKey);
                IOUtils.write("", authConn.getOutputStream(), "UTF-8");
                String token = IOUtils.toString(authConn.getInputStream(), "UTF-8");
                System.out.println(token);
                // Using the access token to build the appid for the request url
                String appId = URLEncoder.encode("Bearer "+token, "UTF-8");
                String text = URLEncoder.encode(inString, "UTF-8");
                String translatorTextApiUrl = String.format("https://api.microsofttranslator.com/v2/http.svc/Translate?appid=%s&text=%s&from=%s&to=%s", appId, text, fromLang, toLang);
                HttpsURLConnection translateConn = (HttpsURLConnection) new URL(translatorTextApiUrl).openConnection();
                translateConn.setRequestMethod("GET");
                translateConn.setRequestProperty("Accept", "application/xml");
                retString = IOUtils.toString(translateConn.getInputStream(), "UTF-8");
                String debug = "look at retString";
            }

            catch (Exception e)
            {
                retString = e.toString();
            }
        }
        else
        {
            retString = "OUT OF TRANSLATION CREDITS - " + inString;
        }

        return retString;

    }

    @Override
    protected void onPostExecute(String result)
    {
        //rest of logic should be here??

        String debug = "look at result";
        String answer = extractTranslation(result);
    .. . . .

【问题讨论】:

  • 你还有这个问题吗?

标签: android azure microsoft-cognitive microsoft-translator


【解决方案1】:

找不到主机看起来像一个简单的连接错误。这些主机确实存在。

您可以通过将调用中的密钥直接传递给 api.microsofttranslator.com 来取消对令牌服务的调用: https://cognitive.uservoice.com/knowledgebase/articles/1815385-api-translator-text-speech-using-the-api-key

这修复了一个主机未找到的问题,但不是另一个。

我建议不要在客户端应用程序中嵌入密钥。从您自己的代理服务调用翻译服务更安全,代理能够安全地将您的客户识别为您的客户。

【讨论】:

    猜你喜欢
    • 2020-03-06
    • 2019-03-20
    • 1970-01-01
    • 1970-01-01
    • 2018-08-05
    • 2017-08-11
    • 1970-01-01
    • 2020-05-18
    • 1970-01-01
    相关资源
    最近更新 更多