JavaでMicrosoft Translator テキスト APIを使って翻訳(日本語→英語)

Microsoft Translator テキスト APIをJavaで試してみました。

意外とJavaのサンプルソースが見つからなかったので参考になればと思い公開します。
key,tokenUrl,transUrlを環境に合わせて変更してもらえればすぐに利用利用可能です。
ちなみに、keyは発行したご自身のものを利用してする必要がありますが、2017/11/05時点では
tokenUrl(認証用トークンAPI-URL)
https://api.cognitive.microsoft.com/sts/v1.0/issueToken
transUrl(翻訳用API-URL)
https://api.microsofttranslator.com/V2/http.svc/TranslateArray
です。

ソース

@Component
public class TranslatorAPI {

    @Value("${translation.subscriptionKey}")
    private String key;

    @Value("${translation.tokenApi.url}")
    private String tokenUrl;

    @Value("${translation.transApi.url}")
    private String transUrl;

    /**
     * 対象文字列を英語に翻訳します。
     * @param words 対象文字
     * @return 翻訳結果
     */
    public String[] translator(String... words) {
        return translatorPOSTToEN(words);
    }

    /**
     * トークンを取得します。
     */
    private String tokenPOST() {
        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {
            HttpPost postMethod = new HttpPost(tokenUrl);

            // Header
            postMethod.setHeader("Content-Type", "application/json");
            postMethod.setHeader("Accept", "application/jwt");
            postMethod.setHeader("Ocp-Apim-Subscription-Key", key);

            try (CloseableHttpResponse response = httpClient.execute(postMethod)) {
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    return EntityUtils.toString(entity, StandardCharsets.UTF_8);
                }
            }
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    /**
     * 翻訳APIにポストします。
     */
    private String[] translatorPOSTToEN(String... words) {
        List<String> rtnWords = new ArrayList<String>();

        try (CloseableHttpClient httpClient = HttpClients.createDefault()) {

            HttpPost postMethod = new HttpPost(transUrl);

            // header
            // 認証トークンを取得
            String token = tokenPOST();
            String authKey = "Bearer " + token;
            postMethod.setHeader("Content-Type", "application/xml");
            postMethod.setHeader("Authorization", authKey);

            // 翻訳ワード
            StringBuilder transWords = new StringBuilder();
            for (String word : words) {
                transWords.append("<string xmlns='http://schemas.microsoft.com/2003/10/Serialization/Arrays'>");
                transWords.append(word);
                transWords.append("</string>");
            }
            StringBuilder requestSB = new StringBuilder();
            requestSB.append("<TranslateArrayRequest>");
            requestSB.append("<AppId />");
            requestSB.append("<Texts>");
            requestSB.append(transWords.toString());
            requestSB.append("</Texts>");
            // 翻訳対象言語を指定
            requestSB.append("<To>en</To>");
            requestSB.append("</TranslateArrayRequest>");

            postMethod.setEntity(new StringEntity(requestSB.toString(),
                    StandardCharsets.UTF_8));

            try (CloseableHttpResponse response = httpClient.execute(postMethod)) {
                if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                    HttpEntity entity = response.getEntity();
                    String res = EntityUtils.toString(entity, StandardCharsets.UTF_8);
                    InputSource inputSource = new InputSource(new StringReader(res));
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder documentBuilder = factory.newDocumentBuilder();
                    Document document = documentBuilder.parse(inputSource);

                    // 翻訳対象文字列文のソートを実行
                    Element root = document.getDocumentElement();
                    NodeList rootChildren = root.getChildNodes();
                    for (int i = 0; i < rootChildren.getLength(); i++) {
                        Node node = rootChildren.item(i);
                        if (node.getNodeType() == Node.ELEMENT_NODE) {
                            Element element = (Element) node;
                            String val = element.getElementsByTagName("TranslatedText").item(0).getFirstChild().getNodeValue();
                            rtnWords.add(val);
                        }
                    }
                }
            }
        } catch (ParserConfigurationException | SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return rtnWords.toArray(new String[rtnWords.size()]);
    }

}

確認

呼び出し
        // サンプル
        String[] words = tranApi.translator("これはペンです", "りんごはおいしい");
        for (String word : words) {
            System.out.println(word);
        }
出力結果
This is a pen.
Apple delicious