官方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个参数。如下表格
这里需要提一下官方文档中的注意事项
注意:
1、请先将需要翻译的文本转换为UTF-8编码
2、在发送HTTP请求之前需要对各字段做URL encode。
3、在生成签名拼接 appid+q+salt+密钥 字符串时,q不需要做URL encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段q做URL encode。
2.请求成功过后的返回结果。如下表格
以下是翻译接收实体类 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 越南语
错误码列表
当翻译结果无法正常返回时,请参考下表处理:
注:本文中使用的httpclient为4.5.5版本。
读者可以在Httpclient maven地址:http://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient 进行 maven依赖或者jar包下载。
转载<<https://blog.csdn.net/belonghuang157405/article/details/80663185>>