android 呼叫百度翻譯API 實現線上翻譯
內容概要
本篇文章為大家演示如何在微信公眾帳號上實現“智慧翻譯”,本例中翻譯功能是通過呼叫“百度翻譯API”實現的。智慧翻譯是指使用者任意輸入想要翻譯的內容(單詞或句子),系統能自動識別使用者採用的語言,並將其翻譯為其他語言,目前支援的翻譯方向:中->英、英->中和日->中。下面我們來看看智慧翻譯最終做出來的效果:
我們通過輸入關鍵詞“翻譯”或者點選選單“翻譯”能夠看到該功能的使用幫助,然後輸入“翻譯+內容”就能對內容進行翻譯了。
百度翻譯API介紹
點選檢視百度翻譯API使用說明,其實這份文件已經說的很詳細了,筆者只是將我們呼叫該介面時最關心的內容摘取出來,主要如下:
1)通過傳送HTTP GET請求呼叫百度翻譯API。
2)百度翻譯API請求地址:
3)呼叫API需要傳遞from、to、client_id和q四個引數,描述如下:
key | value | 描述 |
---|---|---|
from | 源語言語種:語言程式碼或auto | 僅支援特定的語言組合,下面會單獨進行說明 |
to | 目標語言語種:語言程式碼或auto | 僅支援特定的語言組合,下面會單獨進行說明 |
client_id | 開發者在百度連線平臺上註冊得到的授權API key | |
q | 待翻譯內容 | 該欄位必須為UTF-8編碼,並且以GET方式呼叫API時,需要進行urlencode編碼。 |
在呼叫介面前,我們要先獲取到api key。獲取方式比較簡單,根據提示一步步操作就可以,筆者就不再贅述了。4)對於智慧翻譯,引數from和to的傳都是auto。 4)引數q的編碼方式為UTF-8,傳遞之前要進行urlencode編碼。
5)介面返回結果示例如下:
{"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]}
返回結果裡的中文是unicode編碼,需要通過json_decode進行轉換,轉換後的示例如下:
{ "from": "en", "to": "zh", "trans_result": [ { "src": "today", "dst": "今天" }, { "src": "tomorrow", "dst": "明天" } ] }
JSON處理工具包Gson介紹
Gson是Google提供的用於在Java物件和JSON資料之間進行轉換的Java類庫。通過使用Gson類庫,我們可以將JSON字串轉成Java物件,反之亦然。下載地址:https://code.google.com/p/google-gson/downloads/list,Gson的使用比較簡單,直接呼叫它的方法toJson()或fromJson()就能完成相應的轉換,但需要注意的是:在使用Gson將json字串轉換成Java物件之前,需要先建立好與目標Java物件。讀者可以在維基百科上學習它的使用示例http://zh.wikipedia.org/wiki/Gson。
程式碼實現
1)建立與百度翻譯API返回的JSON相對應的Java類
import java.util.List;
/**
* 呼叫百度翻譯api查詢結果
*
* @author liufeng
* @date 2013-10-21
*/
public class TranslateResult {
// 實際採用的源語言
private String from;
// 實際採用的目標語言
private String to;
// 結果體
private List<ResultPair> trans_result;
public String getFrom() {
return from;
}
public void setFrom(String from) {
this.from = from;
}
public String getTo() {
return to;
}
public void setTo(String to) {
this.to = to;
}
public List<ResultPair> getTrans_result() {
return trans_result;
}
public void setTrans_result(List<ResultPair> trans_result) {
this.trans_result = trans_result;
}
}
注意:這裡的類名可以任意取,但是成員變數的名字應於翻譯API返回的JSON字串中的屬性名保持一致,否則將JSON轉換成TranslateResult物件時會報錯。
TranslateResult類中的trans_result屬性是一個ResultPair集合,該類的程式碼如下:
/**
* 結果對
*
* @author liufeng
* @date 2013-10-21
*/
public class ResultPair {
// 原文
private String src;
// 譯文
private String dst;
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getDst() {
return dst;
}
public void setDst(String dst) {
this.dst = dst;
}
}
說明:這兩個類的封裝是Gson類庫所要求的,如果讀者不是用Gson解析json字串,而是用JSON-lib,就沒有必要封裝這兩個類。
2)介面呼叫
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.net.HttpURLConnection;
import java.net.URL;
import com.google.gson.Gson;
/**
*
* @author liufeng
* @date 2013-10-21
*/
public class BaiduTranslateService {
/**
* 發起http請求獲取返回結果
*
* @param requestUrl 請求地址
* @return
*/
public static String httpRequest(String requestUrl) {
StringBuffer buffer = new StringBuffer();
try {
URL url = new URL(requestUrl);
HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection();
httpUrlConn.setDoOutput(false);
httpUrlConn.setDoInput(true);
httpUrlConn.setUseCaches(false);
httpUrlConn.setRequestMethod("GET");
httpUrlConn.connect();
// 將返回的輸入流轉換成字串
InputStream inputStream = httpUrlConn.getInputStream();
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8");
BufferedReader bufferedReader = new BufferedReader(inputStreamReader);
String str = null;
while ((str = bufferedReader.readLine()) != null) {
buffer.append(str);
}
bufferedReader.close();
inputStreamReader.close();
// 釋放資源
inputStream.close();
inputStream = null;
httpUrlConn.disconnect();
} catch (Exception e) {
}
return buffer.toString();
}
/**
* utf編碼
*
* @param source
* @return
*/
public static String urlEncodeUTF8(String source) {
String result = source;
try {
result = java.net.URLEncoder.encode(source, "utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return result;
}
/**
* 翻譯(中->英 英->中 日->中 )
*
* @param source
* @return
*/
public static String translate(String source) {
String dst = null;
// 組裝查詢地址
String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto";
// 對引數q的值進行urlEncode utf-8編碼
requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source));
// 查詢並解析結果
try {
// 查詢並獲取返回結果
String json = httpRequest(requestUrl);
// 通過Gson工具將json轉換成TranslateResult物件
TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class);
// 取出translateResult中的譯文
dst = translateResult.getTrans_result().get(0).getDst();
} catch (Exception e) {
e.printStackTrace();
}
if (null == dst)
dst = "翻譯系統異常,請稍候嘗試!";
return dst;
}
public static void main(String[] args) {
// 翻譯結果:The network really powerful
System.out.println(translate("網路真強大"));
}
}
程式碼解讀: 1)第21-53行封裝了一個http請求方法httpRequest(),相信讀過之前教程的讀者已經很熟悉了。
2)第61-69行封裝了一個urlEncodeUTF8()方法,用於對url中的引數進行UTF-8編碼。
3)第81行程式碼中的client_id需要替換成自己申請的api key。
4)第83行程式碼是對url中的中文進行編碼。以後凡是遇到通過url傳遞中文引數的情況,一定要顯示地對中文進行編碼,否則很可能出現程式在本機能正常執行,但部署到伺服器上卻有問題,因為本機與伺服器的預設編碼方式可能不一樣。
5)第88行程式碼就是呼叫百度翻譯API。
6)第90行程式碼是使用Gson工具將json字串轉換成TranslateResult物件,是不是發現Gson的使用真的很簡單?另外,前面提到過呼叫百度翻譯API返回的json裡如果有中文是用unicode表示的,形如“\u4eca\u5929”,那為什麼這裡沒有做任何處理?因為Gson的內部實現已經幫我們搞定了。
公眾賬號後臺呼叫
在公眾賬號後臺,需要對接收到的文字訊息進行判斷,如果是以“翻譯”兩個字開頭的,就認為是在使用智慧翻譯功能,然後將“翻譯”兩個字之後的內容作為翻譯物件,呼叫API進行翻譯;如果輸入的只有“翻譯”兩個字,就提示智慧翻譯功能的使用指南。關鍵程式碼如下:
// 文字訊息
if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) {
String content = requestMap.get("Content").trim();
if (content.startsWith("翻譯")) {
String keyWord = content.replaceAll("^翻譯", "").trim();
if ("".equals(keyWord)) {
textMessage.setContent(getTranslateUsage());
} else {
textMessage.setContent(BaiduTranslateService.translate(keyWord));
}
out.print(WeixinUtil.textMessageToXml(textMessage));
}
}
第7行getTranslateUsage()方法得到的就是智慧翻譯功能的使用指南,程式碼如下:
/**
* Q譯通使用指南
*
* @return
*/
public static String getTranslateUsage() {
StringBuffer buffer = new StringBuffer();
buffer.append(XiaoqUtil.emoji(0xe148)).append("Q譯通使用指南").append("\n\n");
buffer.append("Q譯通為使用者提供專業的多語言翻譯服務,目前支援以下翻譯方向:").append("\n");
buffer.append(" 中 -> 英").append("\n");
buffer.append(" 英 -> 中").append("\n");
buffer.append(" 日 -> 中").append("\n\n");
buffer.append("使用示例:").append("\n");
buffer.append(" 翻譯我是中國人").append("\n");
buffer.append(" 翻譯dream").append("\n");
buffer.append(" 翻譯さようなら").append("\n\n");
buffer.append("回覆“?”顯示主選單");
return buffer.toString();
}
說明:希望通過本例的學習,除了掌握百度翻譯API的呼叫之外,讀者還能夠掌握json字串的解析方法,這樣就能夠自己學會呼叫更多網際網路上開放的介面。