azure认知翻译服务问题

时间:2017-09-24 19:08:05

标签: android azure microsoft-cognitive microsoft-translator

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

  

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);
    .. . . .

1 个答案:

答案 0 :(得分:0)

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

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

这解决了主机未找到问题之一,但没有解决其他问题。

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