API 的信息建议看官方文档,更全面。百度通用翻译 API 接入文档
主要查找到 API url
、输入参数
、输出参数
。
通用翻译的对外 API 接口
http 版:https://fanyi-api.baidu.com/api/trans/vip/translate
https 版:http://api.fanyi.baidu.com/api/trans/vip/translate
完整的、拼接好的 URL 是怎样的呢?
// 为了方便观看,直接用 get 请求的 URL 来展示
// [] 表示要用实际的值进行填充
http://api.fanyi.baidu.com/api/trans/vip/translate?q=[]&from=[]&to=[]&appid=[]&salt=[]&sign=[]
https://fanyi-api.baidu.com/api/trans/vip/translate?q=[]&from=[]&to=[]&appid=[]&salt=[]&sign=[]
将 Content-Type 请指定为:application/x-www-form-urlencoded
,同时以类的形式上传参数字段名 | 类型 | 是否必填 | 描述 | 备注 |
---|---|---|---|---|
q | String | 是 | 查询的、需要翻译的字段 | UTF-8 编码 |
from | String | 是 | 字段 q 的语言代码名称,源语言代码名称 | 可设置为 auto(根据字段 q 自动输出) |
to | String | 是 | 目标语言代码名称 | 不可设置为 auto |
appid | String | 是 | APP ID | 个人信息处查看 |
salt | String | 是 | 随机数 | 可为字母或数字的字符串 |
sign | String | 是 | 签名 | (appid + q + salt + 密钥)的 MD5 值 |
注意:字段名
是规定好的。
例子:我要将 '苹果' 翻译成 英文
。
q = "苹果",from = "auto"或"zh",to = "en",appid = [APP ID],salt = [随机数],sign = [签名]
。代码名称
名称 | 代码名称 | 名称 | 代码名称 | 名称 | 代码名称 | ||
---|---|---|---|---|---|---|---|
自动检测 | auto | 中文 | zh | 英文 | en | ||
粤语 | yue | 文言文 | wyw | 日语 | jp | ||
韩语 | kor | 法语 | fra | 西班牙语 | spa | ||
泰语 | th | 阿拉伯语 | ara | 俄语 | ru | ||
葡萄牙语 | pt | 德语 | de | 意大利语 | it | ||
希腊语 | el | 荷兰语 | nl | 波兰语 | pl | ||
保加利亚语 | bul | 爱沙尼亚语 | est | 丹麦语 | dan | ||
芬兰语 | fin | 捷克语 | cs | 罗马尼亚语 | rom | ||
斯洛文尼亚语 | slo | 瑞典语 | swe | 匈牙利语 | hu | ||
繁体中文 | cht | 越南语 | vie |
JSON 格式
,包含以下字段
:字段名 | 类型 | 描述 | 备注 |
---|---|---|---|
from | String | 源语言代码名称 | 实际的代码名称(auto 也会解析) |
to | String | 目标语言代码名称 | 实际的代码名称 |
trans_result | String | 翻译结果数组 | 包括 src 和 dst 字段 |
src | String | 翻译原文 | 中文字段会以 |
dst | String | 翻译译文 | 实际的代码名称 |
error_code | Integer | 错误码 | 仅出现错误时显示 |
error_msg | String | 错误含义、信息 | 仅出现错误时显示 |
正确
的情况,返回的 JSON 字符串应该只有 from、to、trans_result、src、dst
五个字段。{
"from": "en",
"to": "zh",
"trans_result": [
{
"src": "apple",
"dst": "苹果"
}
]
}
错误
的情况,返回的 JSON 字符串应该只有 error_code、error_msg
两个字段。{
"error_code": "54001",
"error_msg": "Invalid Sign"
}
错误码 | 含义 | 解决方案 |
---|---|---|
52000 | 成功 | |
52001 | 请求超时 | 请重试 |
52002 | 系统错误 | 请重试 |
52003 | 未授权用户 | 请检查appid是否正确或者服务是否开通 |
54000 | 必填参数为空 | 请检查是否少传参数 |
54001 | 签名错误 | 请检查您的签名生成方法 |
54003 | 访问频率受限 | 请降低您的调用频率,或进行身份认证后切换为高级版/尊享版 |
54004 | 账户余额不足 | 请前往管理控制台为账户充值 |
54005 | 长 query 请求频繁 | 请降低长 query 的发送频率,3s后再试 |
58000 | 客户端 IP 非法 | 检查个人资料里填写的 IP 地址是否正确,可前往开发者信息-基本信息修改 |
58001 | 译文语言方向不支持 | 检查译文语言是否在语言列表里 |
58002 | 服务当前已关闭 | 请前往管理控制台开启服务 |
90107 | 认证未通过或未生效 | 请前往我的认证查看认证进度 |
HttpGet.get(TRANS_API_HOST, params)
MD5.md5(src)
hutool-all(一个 Java 工具类库)
来创建 HTTP请求 和 MD5 加密 签名
。
<dependencies>
<dependency>
<groupId>cn.hutoolgroupId>
<artifactId>hutool-allartifactId>
<version>5.8.5version>
dependency>
dependencies>
创建 GET 请求:HttpUtil.get(TRANS_API_HOST_HTTP, map);
创建 POST 请求:HttpUtil.post(TRANS_API_HOST_HTTP, map);
API URL 是 HTTP 还是 HTTPS 都一样
。
package com.example.demo.service;
import cn.hutool.crypto.SecureUtil;
import cn.hutool.http.HttpUtil;
import com.example.demo.entity.TranslateResults;
import com.google.gson.Gson;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;
import java.util.Map;
/**
* 百度通用翻译 工具类
*
* 接入 百度翻译 API
*
*/
public class BaiduTranslationUtils {
/**
* 对接 百度通用翻译 API(https)
*/
private static final String TRANS_API_HOST_HTTPS = "https://fanyi-api.baidu.com/api/trans/vip/translate";
/**
* 对接 百度通用翻译 API(http)
*/
private static final String TRANS_API_HOST_HTTP = "http://api.fanyi.baidu.com/api/trans/vip/translate";
/**
* 百度翻译 APP ID
*/
private static final String APP_ID = "20220930001363960";
/**
* 百度翻译 APP 密钥
*/
private static final String SECURITY_KEY = "ZWgAN0_8hngJPzuZbCRt";
/**
* JSON 字符串工具类
*/
private static final Gson GSON = new Gson();
public static void main(String[] args) {
String result = BaiduTranslationUtils.getUniversalTranslation("苹果", "auto", "en");
// System.out.println(result);
TranslateResults translateResults = toTranslateResults(result);
translateResults.outputDisplay();
String result1 = BaiduTranslationUtils.getUniversalTranslations("Apple", "auto", "zh");
TranslateResults translateResults1 = toTranslateResults(result1);
translateResults1.outputDisplay();
String result2 = BaiduTranslationUtils.postUniversalTranslation("苹果", "auto", "en");
TranslateResults translateResults2 = toTranslateResults(result2);
translateResults2.outputDisplay();
String result3 = BaiduTranslationUtils.postUniversalTranslations("Apple", "auto", "zh");
TranslateResults translateResults3 = toTranslateResults(result3);
translateResults3.outputDisplay();
}
/**
* 用 GET 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String getUniversalTranslation(String query, String from, String to) {
return getHttpUniversalTranslation(query, from, to);
}
/**
* 用 GET 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String getUniversalTranslations(String query, String from, String to) {
return getHttpsUniversalTranslation(query, from, to);
}
/**
* 用 POST 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String postUniversalTranslation(String query, String from, String to) {
return postHttpUniversalTranslation(query, from, to);
}
/**
* 用 POST 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
public static String postUniversalTranslations(String query, String from, String to) {
return postHttpsUniversalTranslation(query, from, to);
}
/**
* 用 GET 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String getHttpUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.get(TRANS_API_HOST_HTTP, map);
}
/**
* 用 GET 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String getHttpsUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.get(TRANS_API_HOST_HTTPS, map);
}
/**
* 用 POST 请求访问 通用翻译 http API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String postHttpUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.post(TRANS_API_HOST_HTTP, map);
}
/**
* 用 POST 请求访问 通用翻译 https API
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return JSON
*/
private static String postHttpsUniversalTranslation(String query, String from, String to) {
Map<String, Object> map = assemble(query, from, to);
return HttpUtil.post(TRANS_API_HOST_HTTPS, map);
}
/**
* 将 输入参数 组装到 Map 中
*
* @param query 查询的字段
* @param from 源语言代码名称
* @param to 目标语言代码名称
*
* @return Map
*/
private static Map<String, Object> assemble(String query, String from, String to) {
if(query == null || query.isEmpty()) {
query = "中国";
}
if(from == null || from.isEmpty()) {
from = "auto";
}
if(to == null || to.isEmpty()) {
to = "en";
}
Map<String, Object> params = new HashMap<>(5);
// 查询的字段
params.put("q", new String(query.getBytes(StandardCharsets.UTF_8)));
// 源语言代码名称
params.put("from", from);
// 目标语言代码名称
params.put("to", to);
// APP ID
params.put("appid", APP_ID);
// 随机数
String salt = String.valueOf(System.currentTimeMillis());
params.put("salt", salt);
// 加密前的原文
String src = APP_ID + query + salt + SECURITY_KEY;
// 签名
params.put("sign", SecureUtil.md5(src));
return params;
}
/**
* 将 JSON 字符串 转换成 类对象
*
* @param json JSON 字符串
*
* @return 类对象
*/
public static TranslateResults toTranslateResults(String json) {
return GSON.fromJson(json, TranslateResults.class);
}
}
添加上类对象后可能更好
。com.google.code.gson
。
<dependencies>
<dependency>
<groupId>com.google.code.gsongroupId>
<artifactId>gsonartifactId>
<version>2.8.9version>
dependency>
<dependency>
<groupId>org.projectlombokgroupId>
<artifactId>lombokartifactId>
<version>1.18.20version>
<optional>trueoptional>
dependency>
dependencies>
gson.fromJson(json, class)
的形式解析 JSONpublic class BaiduTranslationUtils {
/**
* JSON 字符串工具类
*/
private static final Gson GSON = new Gson();
public static TranslateResults toTranslateResults(String json) {
return GSON.fromJson(json, TranslateResults.class);
}
}
TranslateResults
是自定义的 输出参数类对象
。package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.util.Arrays;
/**
* 翻译结果 类
*/
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class TranslateResults {
/**
* 源语言代码名称
*/
private String from;
/**
* 目标语言代码名称
*/
private String to;
/**
* 翻译结果数组
*/
private TransResult[] trans_result;
/**
* 错误码
*/
private Integer error_code;
/**
* 错误含义、信息
*/
private String error_msg;
@Override
public String toString() {
return "TranslateResults{" +
"from='" + from + '\'' +
", to='" + to + '\'' +
", trans_result=" + Arrays.toString(trans_result) +
", error_code=" + error_code +
", error_msg='" + error_msg + '\'' +
'}';
}
/**
* 输出指点的内容
*/
public void outputDisplay() {
StringBuilder builder = new StringBuilder();
if(error_code == null && error_msg == null) {
builder.append("[");
for(TransResult transResult : trans_result) {
builder.append(transResult.outputDisplay()).append(",");
}
builder.append("]");
} else if(trans_result == null) {
builder.append("{")
.append("错误码 = ").append(error_code)
.append(" , ")
.append("错误信息提示 = ").append(error_msg)
.append("}");
} else {
builder.append("返回值异常请检查!").append(this.toString());
}
System.out.println(builder.toString());
}
}
package com.example.demo.entity;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
import java.net.URLEncoder;
/**
* 翻译原文译文 类
*/
@Setter
@Getter
@NoArgsConstructor
@AllArgsConstructor
public class TransResult {
/**
* 翻译原文
*/
private String src;
/**
* 翻译译文
*/
private String dst;
@Override
public String toString() {
return "TransResult{" +
"src='" + src + '\'' +
", dst='" + dst + '\'' +
'}';
}
/**
* 输出指点的内容
*/
public String outputDisplay() {
return "{" +
"原文 = '" + src + '\'' +
", 译文 = '" + dst + '\'' +
'}';
}
}
中文用 URL 编码来表示
。{
"from": "zh",
"to": "en",
"trans_result": [
{
"src": "\u82f9\u679c",
"dst": "Apple"
}
]
}
添加了类对象及其方法
可以更便捷的输出目标信息。
因为,查询成功时,error_code 和 error_msg 一定为 null,其它字段均有值
;查询失败时,error_code 和 error_msg 不为 null,而其它字段均为 null
;
故,public void outputDisplay() 函数同时支持 正确 和 错误信息的输出
。