简体   繁体   中英

Issue with azure cognitive translation services

After getting the following code to work reliably for a month or so, it stopped working reliably a couple of days ago. About half the time it returns a properly translated string and the other half of the time it returns one of the following two messages:

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

java.net.UnknownHostException: Unable to resolve host "api.microsofttranslator.com": No address associated with hostname

The timing of this problem's beginning coincided with the expiration of my free azure cognitive services account however I migrated to a pay-as-you-go account yesterday and the problem continues.

Why is this happening?

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

Host not found looks like a simple connectivity error. These hosts do exist.

You can void the call to the token service by passing the key in the call to api.microsofttranslator.com directly: https://cognitive.uservoice.com/knowledgebase/articles/1815385-api-translator-text-speech-using-the-api-key

That fixes one of the host not found problems, but not the other.

I would recommend though to not embed the key in the client application. It is safer to call the translator service from your own proxy service, where the proxy is able to safely identify your client as your client.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM