自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

微信公號開發(fā)實戰(zhàn)之智能翻譯

移動開發(fā)
本篇文章為大家演示如何在微信公眾帳號上實現“智能翻譯”,本例中翻譯功能是通過調用“百度翻譯API”實現的。智能翻譯是指用戶任意輸入想要翻譯的內容(單詞或句子),系統(tǒng)能自動識別用戶采用的語言,并將其翻譯為其他語言,目前支持的翻譯方向:中->英、英->中和日->中。

本篇文章為大家演示如何在微信公眾帳號上實現“智能翻譯”,本例中翻譯功能是通過調用“百度翻譯API”實現的。智能翻譯是指用戶任意輸入想要翻譯的內容(單詞或句子),系統(tǒng)能自動識別用戶采用的語言,并將其翻譯為其他語言,目前支持的翻譯方向:中->英、英->中和日->中。下面我們來看看智能翻譯最終做出來的效果:

 

我們通過輸入關鍵詞“翻譯”或者點擊菜單“翻譯”能夠看到該功能的使用幫助,然后輸入“翻譯+內容”就能對內容進行翻譯了。

百度翻譯API介紹

點擊查看百度翻譯API使用說明,其實這份文檔已經說的很詳細了,筆者只是將我們調用該接口時最關心的內容摘取出來,主要如下:

1)通過發(fā)送HTTP GET請求調用百度翻譯API。

2)百度翻譯API請求地址:

  1. http://openapi.baidu.com/public/2.0/bmt/translate 

3)調用API需要傳遞from、to、client_id和q四個參數,描述如下:

key value 描述
from 源語言語種:語言代碼或auto 僅支持特定的語言組合,下面會單獨進行說明
to 目標語言語種:語言代碼或auto 僅支持特定的語言組合,下面會單獨進行說明
client_id 開發(fā)者在百度連接平臺上注冊得到的授權API key 請閱讀如何獲取api key
q 待翻譯內容 該字段必須為UTF-8編碼,并且以GET方式調用API時,需要進行urlencode編碼。

在調用接口前,我們要先獲取到api key。獲取方式比較簡單,根據提示一步步操作就可以,筆者就不再贅述了。
4)對于智能翻譯,參數from和to的傳都是auto。
4)參數q的編碼方式為UTF-8,傳遞之前要進行urlencode編碼。

5)接口返回結果示例如下:

  1. {"from":"en","to":"zh","trans_result":[{"src":"today","dst":"\u4eca\u5929"}]} 

返回結果里的中文是unicode編碼,需要通過json_decode進行轉換,轉換后的示例如下:

  1.     "from""en"
  2.     "to""zh"
  3.     "trans_result": [ 
  4.         { 
  5.             "src""today"
  6.             "dst""今天" 
  7.         }, 
  8.         { 
  9.             "src""tomorrow"
  10.             "dst""明天" 
  11.         } 
  12.     ] 

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對象之前,需要先創(chuàng)建好與目標Java對象。讀者可以在維基百科上學習它的使用示例http://zh.wikipedia.org/wiki/Gson。

代碼實現

1)創(chuàng)建與百度翻譯API返回的JSON相對應的Java類

  1. import java.util.List; 
  2.  
  3. /** 
  4.  * 調用百度翻譯api查詢結果 
  5.  *  
  6.  * @author liufeng 
  7.  * @date 2013-10-21 
  8.  */ 
  9. public class TranslateResult { 
  10.     // 實際采用的源語言 
  11.     private String from; 
  12.     // 實際采用的目標語言 
  13.     private String to; 
  14.     // 結果體 
  15.     private List<ResultPair> trans_result; 
  16.  
  17.     public String getFrom() { 
  18.         return from; 
  19.     } 
  20.  
  21.     public void setFrom(String from) { 
  22.         this.from = from; 
  23.     } 
  24.  
  25.     public String getTo() { 
  26.         return to; 
  27.     } 
  28.  
  29.     public void setTo(String to) { 
  30.         this.to = to; 
  31.     } 
  32.  
  33.     public List<ResultPair> getTrans_result() { 
  34.         return trans_result; 
  35.     } 
  36.  
  37.     public void setTrans_result(List<ResultPair> trans_result) { 
  38.         this.trans_result = trans_result; 
  39.     } 

注意:這里的類名可以任意取,但是成員變量的名字應于翻譯API返回的JSON字符串中的屬性名保持一致,否則將JSON轉換成TranslateResult對象時會報錯。

TranslateResult類中的trans_result屬性是一個ResultPair集合,該類的代碼如下:

  1. /** 
  2.  * 結果對 
  3.  *  
  4.  * @author liufeng 
  5.  * @date 2013-10-21 
  6.  */ 
  7. public class ResultPair { 
  8.     // 原文 
  9.     private String src; 
  10.     // 譯文 
  11.     private String dst; 
  12.  
  13.     public String getSrc() { 
  14.         return src; 
  15.     } 
  16.  
  17.     public void setSrc(String src) { 
  18.         this.src = src; 
  19.     } 
  20.  
  21.     public String getDst() { 
  22.         return dst; 
  23.     } 
  24.  
  25.     public void setDst(String dst) { 
  26.         this.dst = dst; 
  27.     } 

說明:這兩個類的封裝是Gson類庫所要求的,如果讀者不是用Gson解析json字符串,而是用JSON-lib,就沒有必要封裝這兩個類。

2)接口調用

  1. import java.io.BufferedReader; 
  2. import java.io.InputStream; 
  3. import java.io.InputStreamReader; 
  4. import java.io.UnsupportedEncodingException; 
  5. import java.net.HttpURLConnection; 
  6. import java.net.URL; 
  7. import com.google.gson.Gson; 
  8.  
  9. /** 
  10.  *  
  11.  * @author liufeng 
  12.  * @date 2013-10-21 
  13.  */ 
  14. public class BaiduTranslateService { 
  15.     /** 
  16.      * 發(fā)起http請求獲取返回結果 
  17.      *  
  18.      * @param requestUrl 請求地址 
  19.      * @return 
  20.      */ 
  21.     public static String httpRequest(String requestUrl) { 
  22.         StringBuffer buffer = new StringBuffer(); 
  23.         try { 
  24.             URL url = new URL(requestUrl); 
  25.             HttpURLConnection httpUrlConn = (HttpURLConnection) url.openConnection(); 
  26.  
  27.             httpUrlConn.setDoOutput(false); 
  28.             httpUrlConn.setDoInput(true); 
  29.             httpUrlConn.setUseCaches(false); 
  30.  
  31.             httpUrlConn.setRequestMethod("GET"); 
  32.             httpUrlConn.connect(); 
  33.  
  34.             // 將返回的輸入流轉換成字符串 
  35.             InputStream inputStream = httpUrlConn.getInputStream(); 
  36.             InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf-8"); 
  37.             BufferedReader bufferedReader = new BufferedReader(inputStreamReader); 
  38.  
  39.             String str = null
  40.             while ((str = bufferedReader.readLine()) != null) { 
  41.                 buffer.append(str); 
  42.             } 
  43.             bufferedReader.close(); 
  44.             inputStreamReader.close(); 
  45.             // 釋放資源 
  46.             inputStream.close(); 
  47.             inputStream = null
  48.             httpUrlConn.disconnect(); 
  49.  
  50.         } catch (Exception e) { 
  51.         } 
  52.         return buffer.toString(); 
  53.     } 
  54.  
  55.     /** 
  56.      * utf編碼 
  57.      *  
  58.      * @param source 
  59.      * @return 
  60.      */ 
  61.     public static String urlEncodeUTF8(String source) { 
  62.         String result = source; 
  63.         try { 
  64.             result = java.net.URLEncoder.encode(source, "utf-8"); 
  65.         } catch (UnsupportedEncodingException e) { 
  66.             e.printStackTrace(); 
  67.         } 
  68.         return result; 
  69.     } 
  70.  
  71.     /** 
  72.      * 翻譯(中->英 英->中 日->中 ) 
  73.      *  
  74.      * @param source 
  75.      * @return 
  76.      */ 
  77.     public static String translate(String source) { 
  78.         String dst = null
  79.  
  80.         // 組裝查詢地址 
  81.         String requestUrl = "http://openapi.baidu.com/public/2.0/bmt/translate?client_id=AAAAAAAAAAAAAAAAAAAAAAAA&q={keyWord}&from=auto&to=auto"
  82.         // 對參數q的值進行urlEncode utf-8編碼 
  83.         requestUrl = requestUrl.replace("{keyWord}", urlEncodeUTF8(source)); 
  84.  
  85.         // 查詢并解析結果 
  86.         try { 
  87.             // 查詢并獲取返回結果 
  88.             String json = httpRequest(requestUrl); 
  89.             // 通過Gson工具將json轉換成TranslateResult對象 
  90.             TranslateResult translateResult = new Gson().fromJson(json, TranslateResult.class); 
  91.             // 取出translateResult中的譯文 
  92.             dst = translateResult.getTrans_result().get(0).getDst(); 
  93.         } catch (Exception e) { 
  94.             e.printStackTrace(); 
  95.         } 
  96.  
  97.         if (null == dst) 
  98.             dst = "翻譯系統(tǒng)異常,請稍候嘗試!"
  99.         return dst; 
  100.     } 
  101.  
  102.     public static void main(String[] args) { 
  103.         // 翻譯結果:The network really powerful 
  104.         System.out.println(translate("網絡真強大")); 
  105.     } 

代碼解讀:

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對象,是不是發(fā)現Gson的使用真的很簡單?另外,前面提到過調用百度翻譯API返回的json里如果有中文是用unicode表示的,形如“\u4eca\u5929”,那為什么這里沒有做任何處理?因為Gson的內部實現已經幫我們搞定了。

公眾賬號后臺調用

在公眾賬號后臺,需要對接收到的文本消息進行判斷,如果是以“翻譯”兩個字開頭的,就認為是在使用智能翻譯功能,然后將“翻譯”兩個字之后的內容作為翻譯對象,調用API進行翻譯;如果輸入的只有“翻譯”兩個字,就提示智能翻譯功能的使用指南。關鍵代碼如下:

  1. // 文本消息  
  2. if (WeixinUtil.REQ_MESSAGE_TYPE_TEXT.equals(msgType)) { 
  3.     String content = requestMap.get("Content").trim(); 
  4.     if (content.startsWith("翻譯")) { 
  5.         String keyWord = content.replaceAll("^翻譯""").trim(); 
  6.         if ("".equals(keyWord)) { 
  7.             textMessage.setContent(getTranslateUsage()); 
  8.         } else { 
  9.             textMessage.setContent(BaiduTranslateService.translate(keyWord)); 
  10.         } 
  11.         out.print(WeixinUtil.textMessageToXml(textMessage)); 
  12.     } 

第7行getTranslateUsage()方法得到的就是智能翻譯功能的使用指南,代碼如下:

  1. /** 
  2.  * Q譯通使用指南 
  3.  *  
  4.  * @return 
  5.  */ 
  6. public static String getTranslateUsage() { 
  7.     StringBuffer buffer = new StringBuffer(); 
  8.     buffer.append(XiaoqUtil.emoji(0xe148)).append("Q譯通使用指南").append("\n\n"); 
  9.     buffer.append("Q譯通為用戶提供專業(yè)的多語言翻譯服務,目前支持以下翻譯方向:").append("\n"); 
  10.     buffer.append("    中 -> 英").append("\n"); 
  11.     buffer.append("    英 -> 中").append("\n"); 
  12.     buffer.append("    日 -> 中").append("\n\n"); 
  13.     buffer.append("使用示例:").append("\n"); 
  14.     buffer.append("    翻譯我是中國人").append("\n"); 
  15.     buffer.append("    翻譯dream").append("\n"); 
  16.     buffer.append("    翻譯さようなら").append("\n\n"); 
  17.     buffer.append("回復“?”顯示主菜單"); 
  18.     return buffer.toString(); 

說明:希望通過本例的學習,除了掌握百度翻譯API的調用之外,讀者還能夠掌握json字符串的解析方法,這樣就能夠自己學會調用更多互聯(lián)網上開放的接口。

責任編輯:徐川 來源: blog
相關推薦

2013-11-13 01:19:18

2013-11-13 00:51:22

微信微信公號微信公眾賬號

2013-11-13 00:37:12

微信微信公號微信公眾賬號

2013-11-13 00:14:16

微信微信公號微信公眾賬號

2013-11-12 23:32:53

微信公號微信公眾賬號

2013-11-13 00:20:01

微信微信公號微信公眾賬號

2014-09-24 11:11:08

微信企業(yè)號開發(fā)

2014-09-24 11:32:21

微信企業(yè)號開發(fā)

2014-09-24 09:59:23

微信企業(yè)號開發(fā)

2014-09-24 10:29:14

微信企業(yè)號開發(fā)

2014-09-24 11:45:15

微信企業(yè)號開發(fā)

2014-09-24 11:04:31

微信企業(yè)號開發(fā)

2013-04-10 17:52:15

微信公眾平臺接口開發(fā)

2014-09-28 22:30:13

微信企業(yè)號

2014-09-28 22:26:11

微信企業(yè)號

2014-09-24 11:52:37

微信企業(yè)號開發(fā)

2014-09-24 11:47:41

微信企業(yè)號開發(fā)

2015-08-24 15:08:50

OpenShiftNode.js微信開發(fā)

2016-09-28 18:10:59

微信程序MINA

2014-09-25 15:27:28

微信企業(yè)號注冊流程
點贊
收藏

51CTO技術棧公眾號