官方api文档:http://api.fanyi.baidu.com/api/trans/product/apidoc
springboot demo地址:https://github.com/Blankwhiter/translate
第一步:
注册百度账号(自行注册)
第二步
申请百度翻译api ,获得appid以及securityKey
申请教程:https://jingyan.baidu.com/article/3f16e00305bb552591c10304.html
第三步
编写请求工具类(HttpUtil),这里使用Apache Jakarta Common 下的httpclient
Httpclient maven地址:http://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient
以下是请求工具类 HttpUtil code:
import com.alibaba.fastjson.JSONObject; import org.apache.http.HttpEntity; import org.apache.http.NameValuePair; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.CloseableHttpResponse; import org.apache.http.client.methods.HttpGet; import org.apache.http.client.methods.HttpPost; import org.apache.http.entity.StringEntity; import org.apache.http.impl.client.CloseableHttpClient; import org.apache.http.impl.client.HttpClients; import org.apache.http.message.BasicNameValuePair; import org.apache.http.util.EntityUtils; import org.springframework.util.StringUtils; import java.io.IOException; import java.util.ArrayList; import java.util.List; import java.util.Map; / * 请求工具类 */ public class HttpUtil {
/ * get 请求 * @param url * @return * @throws IOException */ public static JSONObject doGetStr(String url) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault(); HttpGet httpGet = new HttpGet(url); CloseableHttpResponse response = httpClient.execute(httpGet); HttpEntity entity = response.getEntity(); if (entity != null) {
String content = EntityUtils.toString(entity,"UTF-8") ; return JSONObject.parseObject(content); } return null; } / * post 请求 String装填 * @param url * @param reqContent * @return * @throws IOException */ public static JSONObject doPostStr(String url,String reqContent) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); if (!StringUtils.isEmpty(reqContent)) {
httpPost.setEntity(new StringEntity(reqContent,"UTF-8")); } CloseableHttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) {
String resContent = EntityUtils.toString(entity,"UTF-8") ; return JSONObject.parseObject(resContent); } return null; } / * post 请求 map装填 * @param url * @param reqContent * @return * @throws IOException */ public static JSONObject doPostStr(String url,Map<String,String> reqContent) throws IOException {
CloseableHttpClient httpClient = HttpClients.createDefault(); HttpPost httpPost = new HttpPost(url); //装填参数 List<NameValuePair> nvps = new ArrayList<NameValuePair>(); if (reqContent != null) {
for (Map.Entry<String, String> entry : reqContent.entrySet()) {
nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue())); } } //设置参数到请求对象中 httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8")); CloseableHttpResponse response = httpClient.execute(httpPost); HttpEntity entity = response.getEntity(); if (entity != null) {
String resContent = EntityUtils.toString(entity, "UTF-8"); return JSONObject.parseObject(resContent); } return null; } }
第四步
编写加密工具类(MD5),该工具类直接使用官方文档中给出的java Demo中的MD5
以下是MD5工具类 MD5 code:
import java.io.*; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; / * MD5加密工具 */ public class MD5 {
// 首先初始化一个字符数组,用来存放每个16进制字符 private static final char[] hexDigits = {
'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) throws UnsupportedEncodingException {
if (input == null) return null; try {
// 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”) MessageDigest messageDigest = MessageDigest.getInstance("MD5"); // 输入的字符串转换成字节数组 byte[] inputByteArray = input.getBytes("utf-8"); // inputByteArray是输入字符串转换得到的字节数组 messageDigest.update(inputByteArray); // 转换并返回结果,也是字节数组,包含16个元素 byte[] resultByteArray = messageDigest.digest(); // 字符数组转换成字符串返回 return byteArrayToHex(resultByteArray); } catch (NoSuchAlgorithmException e) {
return null; } } / * 获取文件的MD5值 * * @param file * @return */ public static String md5(File file) {
try {
if (!file.isFile()) {
System.err.println("文件" + file.getAbsolutePath() + "不存在或者不是文件"); return null; } FileInputStream in = new FileInputStream(file); String result = md5(in); in.close(); return result; } catch (FileNotFoundException e) {
e.printStackTrace(); } catch (IOException e) {
e.printStackTrace(); } return null; } public static String md5(InputStream in) {
try {
MessageDigest messagedigest = MessageDigest.getInstance("MD5"); byte[] buffer = new byte[1024]; int read = 0; while ((read = in.read(buffer)) != -1) {
messagedigest.update(buffer, 0, read); } in.close(); String result = byteArrayToHex(messagedigest.digest()); return result; } catch (NoSuchAlgorithmException e) {
e.printStackTrace(); } catch (FileNotFoundException e) {
e.printStackTrace(); } catch (IOException e) {
e.printStackTrace(); } 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++] = hexDigits[b >>> 4 & 0xf]; resultCharArray[index++] = hexDigits[b & 0xf]; } // 字符数组组合成字符串返回 return new String(resultCharArray); } }
第五步
编写百度翻译接收返回结果实体,以及翻译api工具类。1.在请求翻译api时,需传给接口6个参数。如下表格
| 字段名 | 类型 | 必填参数 | 描述 | 备注 |
|---|---|---|---|---|
| q | TEXT | Y | 请求翻译query | UTF-8编码 |
| from | TEXT | Y | 翻译源语言 | 语言列表(可设置为auto) |
| to | TEXT | Y | 译文语言 | 语言列表(不可设置为auto) |
| appid | INT | Y | APP ID | 可在管理控制台查看 |
| salt | INT | Y | 随机数 | |
| sign | TEXT | Y | 签名 | appid+q+salt+密钥 的MD5值 |
这里需要提一下官方文档中的注意事项
2.请求成功过后的返回结果。如下表格
| 字段名 | 类型 | 描述 |
|---|---|---|
| from | TEXT | 翻译源语言 |
| to | TEXT | 译文语言 |
| trans_result | MIXED LIST | 翻译结果 |
| src | TEXT | 原文 |
| dst | TEXT | 译文 |
以下是翻译接收实体类 TransData code:
说明这里使用lombok中@Data注解实体类,用来省略编写setter getter方法,如果阅读者没有Lombok插件,将注解去掉,自行编写setter getter方法:
import lombok.Data; / * 百度翻译结果 data */ @Data public class TransData {
/ * 原文 */ private String src; / * 译文 */ private String dst; }
以下是翻译接收实体类 code:
import lombok.Data; import java.util.List; / * 翻译结果 实体 */ @Data public class TransResult {
/ *翻译源语言 */ private String from; / *译文语言 */ private String to; / *翻译结果 */ private List<TransData> trans_result; }
以下是翻译api工具类 code:
import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.example.demo.vo.TransResult; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import java.util.HashMap; import java.util.Map; / * 百度翻译api */ public class TranslateUtil {
/ * 百度翻译接口地址 */ private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate"; private static String appid="第二步获得appid"; private static String securityKey="第二步获得securityKey"; / * 获得翻译结果 * @param query * @param from * @param to * @return * @throws IOException */ public static String getTransResult(String query, String from, String to) throws IOException {
Map<String, String> params = buildParams(query, from, to); JSONObject jsonObject; //当请求翻译内容过长 用post if (query.length() >= 2000) {
//post 请求方式 jsonObject = HttpUtil.doPostStr(TRANS_API_HOST, params); } else {
// get请求方式 String url = getUrlWithQueryString(TRANS_API_HOST, params); jsonObject = HttpUtil.doGetStr(url); } if (jsonObject.get("error_code")!=null) {
return "翻译失败,原因:"+jsonObject.get("error_msg"); }else{
TransResult transResult = JSON.parseObject(jsonObject.toString(), TransResult.class); return " 翻译结果 "+transResult.getTrans_result().get(0).getDst(); } } / * 构建参数map * * @param query * @param from * @param to * @return * @throws UnsupportedEncodingException */ private static Map<String, String> buildParams(String query, String from, String to) throws UnsupportedEncodingException {
Map<String, String> params = new HashMap<String, String>(); params.put("q", query); params.put("from", from); params.put("to", to); params.put("appid", appid); // 随机数 String salt = String.valueOf(System.currentTimeMillis()); params.put("salt", salt); // 签名 String src = appid + query + salt + securityKey; // 加密前的原文 params.put("sign", MD5.md5(src)); return params; } / * 拼接url get方式拼接参数 返回url * * @param url * @param params * @return */ public static String getUrlWithQueryString(String url, Map<String, String> params) {
if (params == null) {
return url; } StringBuilder builder = new StringBuilder(url); if (url.contains("?")) {
builder.append("&"); } else {
builder.append("?"); } int i = 0; for (String key : params.keySet()) {
String value = params.get(key); if (value == null) {
// 过滤空的key continue; } if (i != 0) {
builder.append('&'); } builder.append(key); builder.append('='); builder.append(encode(value)); i++; } return builder.toString(); } / * 对输入的字符串进行URL编码, 即转换为%20这种形式 * * @param input 原文 * @return URL编码. 如果编码失败, 则返回原文 */ public static String encode(String input) {
if (input == null) {
return ""; } try {
return URLEncoder.encode(input, "utf-8"); } catch (UnsupportedEncodingException e) {
e.printStackTrace(); } return input; } }
第五步
测试代码 code如下:
public class Test {
public static void main(String[] args) throws IOException {
String transResult = TranslateUtil.getTransResult("步骤到这里就结束了", "auto", "en"); System.out.println(transResult); } }
写在最后,本人所写仅供自己学习,如出错,请阅读者有心请指正。
附录:
语言列表
源语言语种不确定时可设置为 auto,目标语言语种不可设置为 auto。
| 语言简写 | 名称 |
|---|---|
| auto | 自动检测 |
| zh | 中文 |
| en | 英语 |
| yue | 粤语 |
| wyw | 文言文 |
| jp | 日语 |
| kor | 韩语 |
| fra | 法语 |
| spa | 西班牙语 |
| th | 泰语 |
| ara | 阿拉伯语 |
| ru | 俄语 |
| pt | 葡萄牙语 |
| de | 德语 |
| it | 意大利语 |
| el | 希腊语 |
| nl | 荷兰语 |
| pl | 波兰语 |
| bul | 保加利亚语 |
| est | 爱沙尼亚语 |
| dan | 丹麦语 |
| fin | 芬兰语 |
| cs | 捷克语 |
| rom | 罗马尼亚语 |
| slo | 斯洛文尼亚语 |
| swe | 瑞典语 |
| hu | 匈牙利语 |
| cht | 繁体中文 |
| vie | 越南语 |
错误码列表
当翻译结果无法正常返回时,请参考下表处理:
| 错误码 | 含义 | 解决方法 |
|---|---|---|
| 52000 | 成功 | |
| 52001 | 请求超时 | 重试 |
| 52002 | 系统错误 | 重试 |
| 52003 | 未授权用户 | 检查您的 appid 是否正确,或者服务是否开通 |
| 54000 | 必填参数为空 | 检查是否少传参数 |
| 54001 | 签名错误 | 请检查您的签名生成方法 |
| 54003 | 访问频率受限 | 请降低您的调用频率 |
| 54004 | 账户余额不足 | 请前往管理控制平台为账户充值 |
| 54005 | 长query请求频繁 | 请降低长query的发送频率,3s后再试 |
| 58000 | 客户端IP非法 | 检查个人资料里填写的 IP地址 是否正确 可前往管理控制平台修改 IP限制,IP可留空 |
| 58001 | 译文语言方向不支持 | 检查译文语言是否在语言列表里 |
注:本文中使用的httpclient为4.5.5版本。
读者可以在Httpclient maven地址:http://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient 进行 maven依赖或者jar包下载。
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/219472.html原文链接:https://javaforall.net
