背景
- 项目中需使用百度翻译api进行翻译,百度官方虽然提供了java语言demo,但demo中的写法比较复杂。因为后端主要使用springboot来构建项目,所以可以restTemplate来简化对应的访问
具体实现
@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);
}
}
public class Md5Utils {
private static final char[] HEX_DIGITS = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
public static String md5(String input) {
if (input == null) {
return null;
}
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5");
byte[] inputByteArray = input.getBytes(StandardCharsets.UTF_8);
messageDigest.update(inputByteArray);
byte[] resultByteArray = messageDigest.digest();
return byteArrayToHex(resultByteArray);
} catch (NoSuchAlgorithmException e) {
return null;
}
}
private static String byteArrayToHex(byte[] byteArray) {
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);
}
}