Java 使用百度翻译-通用翻译API
筆者近期開發eclipse插件時,需要用到中譯英的功能,所以就研究了一下百度翻譯. 百度翻譯開放平臺為廣大開發者提供了開發服務的平臺,但是并不是免費的.百度翻譯是按字符計費的,每個月200萬字符內是免費的, 超過200萬字符之后,以單價49元/百萬字符收費.
1. 注冊開發者賬號
使用百度翻譯API之前,需要自助注冊百度-翻譯開放平臺的API, 注冊只需要使用手機號注冊即可.筆者注冊的是個人開發者, 注冊完之后可以在開發者信息頁面查看百度翻譯平臺為你分配的個人賬號及秘鑰.
- 注冊地址: http://api.fanyi.baidu.com/api/trans/product/apiapply
- 開發者信息: http://api.fanyi.baidu.com/api/trans/product/desktop?req=developer
- 通用API文檔: http://api.fanyi.baidu.com/api/trans/product/apidoc#joinFile
2. API 簡介
2.1 API 地址
百度翻譯API 提供了Http 或Https 地址, 可以通過GET 或 POST 方式進行訪問, 其中https 使用的是非強制證書方式.
- http地址: http://api.fanyi.baidu.com/api/trans/vip/translate
- https地址: https://fanyi-api.baidu.com/api/trans/vip/translate
2.2 請求參數
百度翻譯請求參數拼接方式為普通get請求參數拼接方式.但是需要注意的是,參數q必須是UTF8編碼,否則翻譯會報錯.而且發送http請求之前需要做URL 編碼.
| q | 請求翻譯原文,必須是UTF-8編碼,否則報錯 |
| from | 翻譯原文語種 |
| to | 翻譯目標語種 |
| appid | 開發平臺注冊APPID |
| salt | 隨機數 |
| sign | 數字簽名, md5(appid+q+salt+秘鑰) |
2.3 響應參數
當翻譯報錯時,會返回error_code 和 error_msg 字段; 當翻譯正確時,返回正確的翻譯內容.
| error_code | 錯誤編碼,當翻譯報錯時有值 |
| error_msg | 錯誤原因, 當翻譯報錯時有值 |
| from | 翻譯原文語種 |
| to | 翻譯目標語種 |
| trans_result | 翻譯列表, 數組類型 |
| src | 原文 |
| dst | 譯文 |
3. Java Demo
筆者使用Java 創建的Maven 項目, 項目源碼地址: https://download.csdn.net/download/zongf0504/10835043
3.1 核心工具類
核心類為BDTransApiUtil, 其中依賴的HttpUtil 可以自定義實現.
import java.util.List; import org.apache.commons.codec.digest.DigestUtils; import org.zongf.learn.baidu.translate.vo.BDTransRequest; import org.zongf.learn.baidu.translate.vo.BDTransResponse; import org.zongf.learn.baidu.translate.vo.BDTransResult; import com.alibaba.fastjson.JSONObject;/*** 百度翻譯工具類* @ClassName: BDTransApiUtil.java* @author zongf* @date 2018年12月7日-上午11:42:26*/ public class BDTransApiUtil {// 百度翻譯地址private static final String TRANS_API_HOST = "https://api.fanyi.baidu.com/api/trans/vip/translate";// 百度翻譯注冊應用idprivate static final String APPID = "xxxxx";// 百度翻譯注冊秘鑰private static final String SECURITYKEY = "xxxxx";/*** @Description 中文翻譯成中文* @param chineseQuery 中文* @return 英文* @author zongf* @date 2018年12月7日-下午1:35:31*/public static String chinese2English(String chineseQuery){// 隨機數long salt = System.currentTimeMillis();// 簽名String src = APPID + chineseQuery + salt + SECURITYKEY; // 加密前的原文String sign = DigestUtils.md5Hex(src);// 構造請求參數BDTransRequest request = new BDTransRequest();request.setFrom("zh");request.setTo("en");request.setAppid(APPID);request.setQ(chineseQuery);request.setSalt("" + salt);request.setSign(sign);// 調用翻譯APIString result = HttpUtil.get(TRANS_API_HOST, request.toMap());// 解析響應結果BDTransResponse response = JSONObject.parseObject(result, BDTransResponse.class);// 判斷錯誤碼if(response.getError_code() != null){return "翻譯報錯-錯誤碼:" + response.getError_code() + ",錯誤原因:" + response.getError_msg();}// 返回結果List<BDTransResult> transResults = response.getTrans_result();if(null != transResults && transResults.size() > 0){return transResults.get(0).getDst();}return null;}}3.2 請求響應類
筆者將百度翻譯的請求響應都封裝成java 對象, 使用JSONObject 進行解析, 這樣便于操作.
public class BDTransRequest {// 翻譯源語種, 默認為中文private String from = "zh";// 目標語種, 默認為英文private String to = "en";// 百度翻譯平臺注冊idprivate String appid;// 隨機數private String salt;// 翻譯原文, UTF-8編碼private String q;// 數字簽名=md5(appid+q+salt+密鑰)private String sign;public Map<String, String> toMap(){Map<String, String> map = new HashMap<String, String>();map.put("q", this.q);map.put("sign", this.sign);map.put("appid", this.appid);map.put("from", this.from);map.put("to", this.to);map.put("salt", this.salt);return map;}// 省略 setter/getter 方法 } public class BDTransResponse {// 原文語種private String from;// 目標語種private String to;// 翻譯結果private List<BDTransResult> trans_result;// 錯誤編碼, 當報錯時才有值private String error_code;// 錯誤信息, 當報錯時才有值private String error_msg;// 省略setter/getter... } public class BDTransResult {// 原文private String src;// 翻譯private String dst;// 省略setter/getter... }3.3 http 工具類
http 工具類主要是為了發送http get 請求, 可以替換為自己的http 工具類.
import java.io.BufferedReader; import java.io.Closeable; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.net.HttpURLConnection; import java.net.InetSocketAddress; import java.net.Proxy; import java.net.URL; import java.net.URLConnection; import java.net.URLEncoder; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.Map;import javax.net.ssl.HttpsURLConnection; import javax.net.ssl.SSLContext; import javax.net.ssl.TrustManager; import javax.net.ssl.X509TrustManager;/*** http 工具類* @ClassName: HttpUtil.java* @author zongf* @date 2018年12月7日-下午1:37:03*/ public class HttpUtil {// 網絡代理ipprivate static final String PROXY_HOST = "xxx.xxx.xxx.xxx";// 網絡代理端口號private static final Integer PROXY_PORT = 8080;// 網絡超時時間protected static final int SOCKET_TIMEOUT = 10000; // 10S// http 請求方式protected static final String HTTP_METHOD = "GET";// x509 證書private static TrustManager myX509TrustManager = new X509TrustManager() {public X509Certificate[] getAcceptedIssuers() {return null;}public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {}public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {}};/*** @Description http 發送get 請求* @param host 請求地址* @param params 請求參數* @return 響應結果* @author zongf* @date 2018年12月7日-下午1:42:26*/public static String get(String host, Map<String, String> params) {try {// 設置SSLContextSSLContext sslcontext = SSLContext.getInstance("TLS");sslcontext.init(null, new TrustManager[] { myX509TrustManager }, null);String uri = connectUrlAndParams(host, params);HttpURLConnection conn = (HttpURLConnection) openConnection(uri);if (conn instanceof HttpsURLConnection) {((HttpsURLConnection) conn).setSSLSocketFactory(sslcontext.getSocketFactory());}conn.setConnectTimeout(SOCKET_TIMEOUT); // 設置相應超時conn.setRequestMethod("GET"); // 設置請求方式int statusCode = conn.getResponseCode();if (statusCode != HttpURLConnection.HTTP_OK) {System.out.println("Http錯誤碼:" + statusCode);}// 讀取服務器的數據InputStream is = conn.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));StringBuilder builder = new StringBuilder();String line = null;while ((line = br.readLine()) != null) {builder.append(line);}String text = builder.toString();close(br); // 關閉數據流close(is); // 關閉數據流conn.disconnect(); // 斷開連接return text;} catch ( Exception e) {e.printStackTrace();}return null;}/*** @Description 獲取* @param url* @return* @throws IOException* @author zongf* @date 2018年12月7日-下午1:33:27*/private static URLConnection openConnection(String uri) throws IOException {URLConnection connection;URL url = new URL(uri); // 創建URL對象if (PROXY_HOST != null && PROXY_PORT != null) {Proxy proxy = new Proxy(Proxy.Type.HTTP, new InetSocketAddress(PROXY_HOST, PROXY_PORT));connection = url.openConnection(proxy);} else {connection = url.openConnection();}return connection;}/*** @Description 拼接url和請求參數* @param url 請求地址* @param params 請求參數* @return String* @author zongf* @date 2018年12月7日-下午1:43:12*/public static String connectUrlAndParams(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) { // 過濾空的keycontinue;}if (i != 0) {builder.append('&');}builder.append(key);builder.append('=');builder.append(encode(value));i++;}return builder.toString();}/*** @Description 對輸入的字符串進行URL編碼, 即轉換為%20這種形式* @param input 原文* @return URL編碼. 如果編碼失敗, 則返回原文* @author zongf* @date 2018年12月7日-下午1:28:28*/public static String encode(String input) {if (input == null) {return "";}try {return URLEncoder.encode(input, "utf-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}return input;}/*** @Description 關閉流* @param closeable* @author zongf* @date 2018年12月7日-下午1:28:08*/private static void close(Closeable closeable) {if (closeable != null) {try {closeable.close();} catch (IOException e) {e.printStackTrace();}}} }3.4 pom 核心依賴
demo 主要依賴于apache 的加解密工具包, 和阿里巴巴的json 工具包.
<dependencies><!-- 提供單元測試 --><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency><!-- 提供json 解析工具 --><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.54</version></dependency><!-- 提供md5 加密工具 --><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version></dependency></dependencies>4. 測試
寫成靜態工具類之后,直接通過類名.方法名調用即可.
public class BDTransUtilTest {@Testpublic void test() {String result = BDTransApiUtil.chinese2English("你好");System.out.println(result); // 輸出: hello}}附
由于筆者是在開發eclipse插件時用到了百度翻譯, 在windows平臺下,eclipse啟動時默認jvm 編碼為GBK ,也就是說eclipse中表單中輸入的字符串都是GBK編碼的,而GBK編碼又不能轉化為UTF8編碼,因此需要修改eclipse的啟動參數. 編輯eclipse.ini 文件, 添加如下配置:
-Dfile.encoding=UTF-8總結
以上是生活随笔為你收集整理的Java 使用百度翻译-通用翻译API的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: oracle32 plsql,32位pl
- 下一篇: 一文读懂YUV的采样与格式