springboot - restTemplate访问百度翻译API

814 阅读1分钟

背景

  • 项目中需使用百度翻译api进行翻译,百度官方虽然提供了java语言demo,但demo中的写法比较复杂。因为后端主要使用springboot来构建项目,所以可以restTemplate来简化对应的访问

具体实现

/**
 * 百度翻译API,详见:https://fanyi-api.baidu.com/api/trans/product/apidoc#appendix
 *
 */
@Service
public class BaiduTranslationApi {
    private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate";

    @Value("${baidu.translation.appid}")
    private String appid;
    @Value("${baidu.translation.security-key}")
    private String securityKey;

    @Autowired
    private RestTemplate restTemplate;

    public String getTransResult(String query, String from, String to) {

        HttpHeaders headers = new HttpHeaders();
        headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
        headers.setAccept(Collections.singletonList(MediaType.APPLICATION_JSON));
        MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
        params.add("q", query);
        params.add("from", from);
        params.add("to", to);
        params.add("appid", appid);
        // 随机数
        String salt = String.valueOf(System.currentTimeMillis());
        params.add("salt", salt);
        // 签名
        String src = appid + query + salt + securityKey;
        params.add("sign", Md5Utils.md5(src));

        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<>(params, headers);
        return restTemplate.postForObject(TRANS_API_HOST, httpEntity, String.class);
    }

}
  • MD5 工具类
/**
 * MD5工具类
 */
public class Md5Utils {
    /**
     * 存放每个16进制字符
     */
    private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};

    /**
     * 获得一个字符串的MD5值
     *
     * @param input 输入的字符串
     * @return 输入字符串的MD5值
     */
    public static String md5(String input) {
        if (input == null) {
            return null;
        }

        try {
            // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 输入的字符串转换成字节数组
            byte[] inputByteArray = input.getBytes(StandardCharsets.UTF_8);
            // inputByteArray是输入字符串转换得到的字节数组
            messageDigest.update(inputByteArray);
            // 转换并返回结果,也是字节数组,包含16个元素
            byte[] resultByteArray = messageDigest.digest();
            // 字符数组转换成字符串返回
            return byteArrayToHex(resultByteArray);
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }

    private static String byteArrayToHex(byte[] byteArray) {
        // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
        char[] resultCharArray = new char[byteArray.length * 2];
        // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
        int index = 0;
        for (byte b : byteArray) {
            resultCharArray[index++] = HEX_DIGITS[b >>> 4 & 0xf];
            resultCharArray[index++] = HEX_DIGITS[b & 0xf];
        }

        // 字符数组组合成字符串返回
        return new String(resultCharArray);
    }

}