API簡介
API(Application Programming Interface,應用程序接口)是一些預先定義的函數,或指軟件系統不同組成部分銜接的約定。 用來提供應用程序與開發人員基於某軟件或硬件得以訪問的一組例程,而又無需訪問原碼,或理解內部工作機制的細節。
API接口的申請
這裏以百度翻譯API示例:
百度翻譯開放平臺:https://api.fanyi.baidu.com
進入網址後,先去登錄(註冊)一個百度賬號,登錄以後,點擊右上角名稱下的 “開發者信息” ,這裏有你的APP ID和你的密鑰(KEY)
然後,有了APP ID和密鑰(KEY)以後,你就可以去選擇一種API服務進行使用了,這裏我以一個簡單的“通用翻譯API”進行講解[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-pYAmqFI0-1589877307755)(E:\ASYU\Desktop\通用翻譯.png)]
API接口的要素:
接入地址
通用翻譯API HTTPS地址:https://fanyi-api.baidu.com/api/trans/vip/translate
我們接入API都是需要一個API地址才能進行使用的,這裏我們選擇下面HTTPS地址(HTTP和HTTPS的區別可以自行進行了解)進行使用
輸入參數
可以看到,接入文檔裏有一個“入參”列表,這裏我們要知道 “必填參數” 裏面有 Y/N ,意思是 Y 代表這個參數是每次請求數據必須傳入的,否則請求會報錯,而 N 則是不必須(也就是可選的),這裏也可以看到,這裏的 tts 和 dict 是開通了詞典、TTS者需填寫的
請求方式
這裏可以從入參下面的文字看到,“請求方式可使用GET或POST方式”,這也是API請求最常用的兩種方式了
輸出參數
輸出參數也就是我們發送了數據請求,然後服務器給我們返回來的數據,現在大多數API接口也都是返回Json格式的數據,由於每次返回的參數又往往包含了很多其他我們不需要的參數,所以這時我們就需要通過解析Json格式內容來獲取我們真正需要的信息。
實戰應用
正確地獲取入參
q = 這是我們需要翻譯的文本
from = auto(這裏我選擇自動識別)
to = zh(中文)
appid = 個人開發者信息裏有
salt = 100(在程序裏隨機數獲取)
sign簽名(小白難點):
簽名的獲取,是相對所有入參裏面最麻煩的,公式 = MD5(appid + q + salt + key),也就是先要把幾個入參和密鑰先連接起來(字符串形式),然後再對其進行MD5加密
其中MD5加密的方法可以看這篇文章:MD5加密
發送請求
這裏的話我用的是OKHttp,依賴:
implementation 'com.squareup.okhttp3:okhttp:3.12.1'
OkHttp的用法:OkHttp的詳細使用方法
然後寫了一個簡單的請求工具類,這裏是寫了兩個方法
- 中英互譯:通過傳入的內容,然後通過其字符串長度和字節數的對比來判斷輸入的是中文還是英文
- 多語言翻譯:通過選擇源語言和譯文語言來進行翻譯,這裏輸入是輸入語言名,比如中文、英文、粵語等,然後通過一個HashMap來獲取對應的語言代碼
解析出參
請求數據獲取到的內容是這樣的Json數據:
{
"from": "en",
"to": "zh",
"trans_result": [{
"dst": "愛",
"src": "love"
}]
}
這裏我輸入的是 love ,所以我們需要的數據是:愛 這個字,也就是 trans_result 下的 dst 內容,其他的內容對於我們來說都不是那麼重要,拿到翻譯結果就完成任務了
Tip:這裏我用的是fastjson,依賴:implementation ‘com.alibaba:fastjson:1.1.71.android’
JSONObject jsonObject = JSON.parseObject(response.body().string());
JSONArray array = jsonObject.getJSONArray("trans_result");
for (int i = 0; i < array.size(); i++) {
JSONObject object = (JSONObject) array.get(i);
result = object.getString("dst");
}
完整Java代碼:
public class BaiDuUtils {
// 請求地址
private static final String URL = "https://fanyi-api.baidu.com/api/trans/vip/translate";
// 應用id(開發者信息裏)
private static final String APP_ID = "";
// 密鑰(開發者信息裏)
private static final String KEY = "";
// 隨機數對象
private static Random sRandom = new Random();
/**
* 中英互譯(自動檢測)
*
* @param q 待翻譯文本
* */
public static String translate(String q) {
// 源語言
String from = "";
// 譯文語言
String to = "";
// 字符長度和字符的字節長度相等,則說明沒有中文
if (q.length() == q.getBytes().length) {
from = "en";
to = "zh";
} else {
from = "zh";
to = "en";
}
// 翻譯結果
String result = "";
// 隨機數
String salt = String.valueOf(sRandom.nextInt(100));
// 合成簽名
String strSign = APP_ID + q + salt + KEY;
// 將sign串轉化成MD5
String sign = MD5Utils.MD5(strSign);
// 實例化OkHttpClient對象
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("q", q)
.add("from", from)
.add("to", to)
.add("appid", APP_ID)
.add("salt", salt)
.add("sign", sign)
.build();
Request request = new Request.Builder()
.url(URL)
.post(requestBody)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
JSONObject jsonObject = JSON.parseObject(response.body().string());
JSONArray array = jsonObject.getJSONArray("trans_result");
for (int i = 0; i < array.size(); i++) {
JSONObject object = (JSONObject) array.get(i);
result = object.getString("dst");
Log.d("BaiDuUtils", "translate: 成功!結果:" + result);
return result;
}
} catch (IOException e) {
Log.d("BaiDuUtils", "translate: 失敗!");
return "請求錯誤";
}
return result;
}
/**
* 多語言翻譯
*
* @param q 待翻譯文本
* @param from 源語言類型
* @param to 目標語言類型
* */
public static String translate(String q, String from, String to) {
// 從Spinner獲取過來的是中文,所以需要轉化成代碼
from = getLanguage(from);
to = getLanguage(to);
// 翻譯結果
String result = "";
// 隨機數
String salt = String.valueOf(sRandom.nextInt(100));
// 合成簽名
String strSign = APP_ID + q + salt + KEY;
// 將sign串轉化成MD5
String sign = MD5Utils.MD5(strSign);
// 實例化OkHttpClient對象
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("q", q)
.add("from", from)
.add("to", to)
.add("appid", APP_ID)
.add("salt", salt)
.add("sign", sign)
.build();
Request request = new Request.Builder()
.url(URL)
.post(requestBody)
.build();
Response response = null;
try {
response = client.newCall(request).execute();
JSONObject jsonObject = JSON.parseObject(response.body().string());
JSONArray array = jsonObject.getJSONArray("trans_result");
for (int i = 0; i < array.size(); i++) {
JSONObject object = (JSONObject) array.get(i);
result = object.getString("dst");
Log.d("BaiDuUtils", "translate: 成功!結果:" + result);
return result;
}
} catch (IOException e) {
Log.d("BaiDuUtils", "translate: 失敗!");
return "請求錯誤";
}
return result;
}
// 通過傳入中文,返回對應的語言代碼
private static String getLanguage(String key) {
Map<String, String> map = new HashMap<>();
map.put("自動檢測", "auto");
map.put("中文", "zh");
map.put("英文", "en");
map.put("粵語", "yue");
map.put("文言文", "wyw");
map.put("日語", "jp");
map.put("韓語", "kor");
map.put("法語", "fra");
map.put("西班牙語", "spa");
map.put("泰語", "th");
map.put("阿拉伯語", "ara");
map.put("俄語", "ru");
map.put("葡萄牙語", "pt");
map.put("德語", "de");
map.put("意大利語", "it");
map.put("希臘語", "el");
map.put("荷蘭語", "nl");
map.put("波蘭語", "pl");
map.put("保加利亞語", "bul");
map.put("愛沙尼亞語", "est");
map.put("丹麥語", "dan");
map.put("芬蘭語", "fin");
map.put("捷克語", "cs");
map.put("羅馬尼亞語", "rom");
map.put("斯洛文尼亞語", "slo");
map.put("瑞典語", "swe");
map.put("匈牙利語", "hu");
map.put("繁體中文", "cht");
map.put("越南語", "vie");
return map.get(key);
}
結語:其實目前大部分的API接口使用方法都差不多,一般來說只要會了一個,其他的API接口只需要簡單看其官網提供的開發者文檔即可!
如果你覺得文章寫得還不是太爛,點個贊再走吧!