文章目录
- API简介
- API接口的申请
- API接口的要素:
- 接入地址
- 输入参数
- 请求方式
- 输出参数
- 实战应用
- 正确地获取入参
- 发送请求
- 解析出参
- 完整Java代码:
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();
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;
}
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接口只需要简单看其官网提供的开发者文档即可!
如果你觉得文章写得还不是太烂,点个赞再走吧!