百度翻译 API 的申请 与 百度通用翻译 API 的接入

百度翻译 API 的申请 与 百度通用翻译 API 的接入

申请

  • 进入百度翻译开放平台,选择 立刻使用
    百度翻译 API 的申请 与 百度通用翻译 API 的接入_第1张图片

  • 选择我的服务,开通 通用翻译,填信息后秒过。
    百度翻译 API 的申请 与 百度通用翻译 API 的接入_第2张图片

  • 建议 实名认证,提高免费额度。
    在这里插入图片描述

  • 通过后,可以在开发者信息中查看所有信息,如:APPID、密钥 等等。
    百度翻译 API 的申请 与 百度通用翻译 API 的接入_第3张图片

IDEA 翻译插件 translate 换成 百度翻译引擎

  • 文件(File) -> 设置(Settings) -> 工具(Tools) -> 翻译(Translate) 进入翻译设置界面。
    百度翻译 API 的申请 与 百度通用翻译 API 的接入_第4张图片

  • 设置翻译引擎为百度翻译。

  • 输入应用程序 ID 和 密钥
    百度翻译 API 的申请 与 百度通用翻译 API 的接入_第5张图片

用 Java 的代码方式接入 百度通用翻译 API

  • API 的信息建议看官方文档,更全面。百度通用翻译 API 接入文档

  • 主要查找到 API url输入参数输出参数

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=[]
  • post 请求需要将 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 认证未通过或未生效 请前往我的认证查看认证进度

代码实现

下载百度通用翻译 API 接入文档中的 demo 代码
  • 代码中,是自行创建了一个 GET 请求类来创建 GET 请求访问 API。
HttpGet.get(TRANS_API_HOST, params)
  • 同样创建了一个 MD5 工具类来加密 签名。
MD5.md5(src)
  • 下载链接:Java 版 Demo
自行编写
  • 引入 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); } }

  • 在 实例中,没有为输入参数配置相应的类对象。添加上类对象后可能更好
解析输出的 JSON 字符串
  • 我使用的类库是: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) 的形式解析 JSON
public 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() 函数同时支持 正确 和 错误信息的输出

你可能感兴趣的:(通用的知识,idea,小技巧,Java,学习笔记,java,idea,自动翻译,百度,后端)