百度通用翻译api使用

2023-11-15

官方api文档:http://api.fanyi.baidu.com/api/trans/product/apidoc

springboot demo地址:https://github.com/Blankwhiter/translate

第一步:

注册百度账号(自行注册)

第二步

申请百度翻译api ,获得appid以及securityKey

申请教程:https://jingyan.baidu.com/article/3f16e00305bb552591c10304.html

第三步

编写请求工具类(HttpUtil),这里使用Apache Jakarta Common 下的httpclient

Httpclient maven地址:http://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient

以下是请求工具类 HttpUtil code:


import com.alibaba.fastjson.JSONObject;
import org.apache.http.HttpEntity;
import org.apache.http.NameValuePair;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.util.EntityUtils;
import org.springframework.util.StringUtils;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

/**
 * 请求工具类
 */
public class HttpUtil {
    /**
     *  get 请求
     * @param url
     * @return
     * @throws IOException
     */
    public static JSONObject doGetStr(String url) throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpGet httpGet = new HttpGet(url);
        CloseableHttpResponse response = httpClient.execute(httpGet);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            String content = EntityUtils.toString(entity,"UTF-8") ;
            return JSONObject.parseObject(content);
        }
        return null;
    }

    /**
     * post 请求 String装填
     * @param url
     * @param reqContent
     * @return
     * @throws IOException
     */
    public static JSONObject doPostStr(String url,String reqContent) throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);
        if (!StringUtils.isEmpty(reqContent)) {
            httpPost.setEntity(new StringEntity(reqContent,"UTF-8"));
        }
        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            String resContent = EntityUtils.toString(entity,"UTF-8") ;
            return JSONObject.parseObject(resContent);
        }
        return null;
    }
    /**
     * post 请求 map装填
     * @param url
     * @param reqContent
     * @return
     * @throws IOException
     */
    public static JSONObject doPostStr(String url,Map<String,String> reqContent) throws IOException {
        CloseableHttpClient httpClient = HttpClients.createDefault();
        HttpPost httpPost = new HttpPost(url);

        //装填参数
        List<NameValuePair> nvps = new ArrayList<NameValuePair>();
        if (reqContent != null) {
            for (Map.Entry<String, String> entry : reqContent.entrySet()) {
                nvps.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
            }
        }
        //设置参数到请求对象中
        httpPost.setEntity(new UrlEncodedFormEntity(nvps, "UTF-8"));

        CloseableHttpResponse response = httpClient.execute(httpPost);
        HttpEntity entity = response.getEntity();
        if (entity != null) {
            String resContent = EntityUtils.toString(entity, "UTF-8");
            return JSONObject.parseObject(resContent);
        }
        return null;
    }
}


第四步

编写加密工具类(MD5),该工具类直接使用官方文档中给出的java Demo中的MD5

以下是MD5工具类 MD5 code:


import java.io.*;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * MD5加密工具
 */
public class MD5 {
    // 首先初始化一个字符数组,用来存放每个16进制字符
    private static final char[] hexDigits = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd',
            'e', 'f' };

    /**
     * 获得一个字符串的MD5值
     *
     * @param input 输入的字符串
     * @return 输入字符串的MD5值
     *
     */
    public static String md5(String input) throws UnsupportedEncodingException {
        if (input == null)
            return null;

        try {
            // 拿到一个MD5转换器(如果想要SHA1参数换成”SHA1”)
            MessageDigest messageDigest = MessageDigest.getInstance("MD5");
            // 输入的字符串转换成字节数组
            byte[] inputByteArray = input.getBytes("utf-8");
            // inputByteArray是输入字符串转换得到的字节数组
            messageDigest.update(inputByteArray);
            // 转换并返回结果,也是字节数组,包含16个元素
            byte[] resultByteArray = messageDigest.digest();
            // 字符数组转换成字符串返回
            return byteArrayToHex(resultByteArray);
        } catch (NoSuchAlgorithmException e) {
            return null;
        }
    }

    /**
     * 获取文件的MD5值
     *
     * @param file
     * @return
     */
    public static String md5(File file) {
        try {
            if (!file.isFile()) {
                System.err.println("文件" + file.getAbsolutePath() + "不存在或者不是文件");
                return null;
            }

            FileInputStream in = new FileInputStream(file);

            String result = md5(in);

            in.close();

            return result;

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    public static String md5(InputStream in) {

        try {
            MessageDigest messagedigest = MessageDigest.getInstance("MD5");

            byte[] buffer = new byte[1024];
            int read = 0;
            while ((read = in.read(buffer)) != -1) {
                messagedigest.update(buffer, 0, read);
            }

            in.close();

            String result = byteArrayToHex(messagedigest.digest());

            return result;
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        return null;
    }

    private static String byteArrayToHex(byte[] byteArray) {
        // new一个字符数组,这个就是用来组成结果字符串的(解释一下:一个byte是八位二进制,也就是2位十六进制字符(2的8次方等于16的2次方))
        char[] resultCharArray = new char[byteArray.length * 2];
        // 遍历字节数组,通过位运算(位运算效率高),转换成字符放到字符数组中去
        int index = 0;
        for (byte b : byteArray) {
            resultCharArray[index++] = hexDigits[b >>> 4 & 0xf];
            resultCharArray[index++] = hexDigits[b & 0xf];
        }

        // 字符数组组合成字符串返回
        return new String(resultCharArray);

    }

}

第五步

编写百度翻译接收返回结果实体,以及翻译api工具类。1.在请求翻译api时,需传给接口6个参数。如下表格

字段名 类型 必填参数 描述 备注
q TEXT Y 请求翻译query UTF-8编码
from TEXT Y 翻译源语言 语言列表(可设置为auto)
to TEXT Y 译文语言 语言列表(不可设置为auto)
appid INT Y APP ID 可在管理控制台查看
salt INT Y 随机数
sign TEXT Y 签名 appid+q+salt+密钥 的MD5值

这里需要提一下官方文档中的注意事项

注意:

1、请先将需要翻译的文本转换为UTF-8编码

2、在发送HTTP请求之前需要对各字段做URL encode。

3、在生成签名拼接 appid+q+salt+密钥 字符串时,q不需要做URL encode,在生成签名之后,发送HTTP请求之前才需要对要发送的待翻译文本字段q做URL encode。

2.请求成功过后的返回结果。如下表格

字段名 类型 描述
from TEXT 翻译源语言
to TEXT 译文语言
trans_result MIXED LIST 翻译结果
src TEXT 原文
dst TEXT 译文

以下是翻译接收实体类 TransData code:

说明这里使用lombok中@Data注解实体类,用来省略编写setter getter方法,如果阅读者没有Lombok插件,将注解去掉,自行编写setter getter方法:

import lombok.Data;

/**
 *  百度翻译结果 data
 */
@Data
public class TransData {
    /**
     * 原文
     */
    private String src;
    /**
     * 译文
     */
    private String dst;
}

以下是翻译接收实体类 code:

import lombok.Data;

import java.util.List;

/**
 *  翻译结果 实体
 */
@Data
public class TransResult {
    /**
     *翻译源语言
     */
    private String from;
    /**
     *译文语言
     */
    private String to;
    /**
     *翻译结果
     */
    private List<TransData> trans_result;
}

以下是翻译api工具类 code:


import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.example.demo.vo.TransResult;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.Map;



/**
 * 百度翻译api
 */
public class TranslateUtil {
    /**
     * 百度翻译接口地址
     */
    private static final String TRANS_API_HOST = "http://api.fanyi.baidu.com/api/trans/vip/translate";


    private static String appid="第二步获得appid";

    private static String securityKey="第二步获得securityKey";

    /**
     * 获得翻译结果
     * @param query
     * @param from
     * @param to
     * @return
     * @throws IOException
     */
    public static String getTransResult(String query, String from, String to) throws IOException {
        Map<String, String> params = buildParams(query, from, to);
        JSONObject jsonObject;
        //当请求翻译内容过长 用post
        if (query.length() >= 2000) {
            //post 请求方式
            jsonObject = HttpUtil.doPostStr(TRANS_API_HOST, params);
        } else {
           //  get请求方式
            String url = getUrlWithQueryString(TRANS_API_HOST, params);
            jsonObject = HttpUtil.doGetStr(url);
        }
        if (jsonObject.get("error_code")!=null) {
            return "翻译失败,原因:"+jsonObject.get("error_msg");
        }else{
            TransResult transResult = JSON.parseObject(jsonObject.toString(), TransResult.class);
            return " 翻译结果 "+transResult.getTrans_result().get(0).getDst();
        }
    }

    /**
     * 构建参数map
     *
     * @param query
     * @param from
     * @param to
     * @return
     * @throws UnsupportedEncodingException
     */
    private static Map<String, String> buildParams(String query, String from, String to) throws UnsupportedEncodingException {
        Map<String, String> params = new HashMap<String, String>();
        params.put("q", query);
        params.put("from", from);
        params.put("to", to);

        params.put("appid", appid);

        // 随机数
        String salt = String.valueOf(System.currentTimeMillis());
        params.put("salt", salt);

        // 签名
        String src = appid + query + salt + securityKey; // 加密前的原文
        params.put("sign", MD5.md5(src));

        return params;
    }


    /**
     * 拼接url get方式拼接参数  返回url
     *
     * @param url
     * @param params
     * @return
     */
    public static String getUrlWithQueryString(String url, Map<String, String> params) {
        if (params == null) {
            return url;
        }

        StringBuilder builder = new StringBuilder(url);
        if (url.contains("?")) {
            builder.append("&");
        } else {
            builder.append("?");
        }

        int i = 0;
        for (String key : params.keySet()) {
            String value = params.get(key);
            if (value == null) { // 过滤空的key
                continue;
            }

            if (i != 0) {
                builder.append('&');
            }

            builder.append(key);
            builder.append('=');
            builder.append(encode(value));

            i++;
        }

        return builder.toString();
    }


    /**
     * 对输入的字符串进行URL编码, 即转换为%20这种形式
     *
     * @param input 原文
     * @return URL编码. 如果编码失败, 则返回原文
     */
    public static String encode(String input) {
        if (input == null) {
            return "";
        }

        try {
            return URLEncoder.encode(input, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }

        return input;
    }
}

第五步

测试代码 code如下:

public class Test {
    public static void main(String[] args) throws IOException {
        String transResult = TranslateUtil.getTransResult("步骤到这里就结束了", "auto", "en");
        System.out.println(transResult);
    }
}

写在最后,本人所写仅供自己学习,如出错,请阅读者有心请指正。

附录:

语言列表

源语言语种不确定时可设置为 auto,目标语言语种不可设置为 auto。

语言简写 名称
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 越南语

错误码列表

当翻译结果无法正常返回时,请参考下表处理:

错误码 含义 解决方法
52000 成功
52001 请求超时 重试
52002 系统错误 重试
52003 未授权用户 检查您的 appid 是否正确,或者服务是否开通
54000 必填参数为空 检查是否少传参数
54001 签名错误 请检查您的签名生成方法
54003 访问频率受限 请降低您的调用频率
54004 账户余额不足 请前往管理控制平台为账户充值
54005 长query请求频繁 请降低长query的发送频率,3s后再试
58000 客户端IP非法 检查个人资料里填写的 IP地址 是否正确
可前往管理控制平台修改
IP限制,IP可留空
58001 译文语言方向不支持 检查译文语言是否在语言列表里

注:本文中使用的httpclient为4.5.5版本。
读者可以在Httpclient maven地址:http://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient 进行 maven依赖或者jar包下载。

如下图所示:
一:选中所需的版本,查看具体详情
在这里插入图片描述
二:maven依赖或者jar包下载
在这里插入图片描述
将maven加入加入pom.xml,或者将jar加入工程的lib中。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

百度通用翻译api使用 的相关文章

随机推荐

  • uniapp返回上一页,回到顶部实现【记录】

    CSS样式中传入变量 鑫动了的主页 欢迎各位小伙伴 前端小白的成长之路 一起学习 一起成长 在返回上一页时如果不想停留在当前位置 想点击或者自动回到顶部可以用下面的方法 注 使用了scroll view并设置高度时再使用 uni pageS
  • nginx worker_connections exceed 1024 修改

    玩nginx配置的朋友 有时会见到这个提示 warn 3660 0 20000 worker connections are more than open file resource limit 1024 原来安装好nginx之后 默认最大
  • 对多态的理解

    1 虚函数 定义 前面有virtual关键字的成员函数就是虚函数 2 什么是多态 一 将派生类的指针赋给基类指针 则可通过基类指针调用派生类的同名虚函数 include
  • Qt项目实战杂谈一二:网页/应用嵌入技术

    这一篇 应该说是满满的诚意了 很早之前就有完成此篇的打算 奈何一直没有时间 要么是沉迷于编码无法自拔 要么就是执着于释放身心的游戏而偷偷爽快不已 今天 我们说说老牌软件的一个趋势 和对应的某些技术细节的实现点 可能有点长 看这写吧 过长可能
  • The type or namespace name '****' could not be found (are you missing a using directive or an assemb...

    错误的提升内容 具体情况 本人出现这种问题的情况是这样的 本人解决方案的主 exe项目的目标框架情况如下 而 该项目所依赖的附加类库项目的目标框架为 4 5 造成在 exe项目中 无法识别所引用的类库 而出现下图左所示的黄色三角形标志 此外
  • 问题解决:记录一次Linux服务器根目录突然爆满

    一 出问题了 过了个双休来到公司 同时发现Linux终端的服务器状态中根目录空间直接爆满100 周五走之前根目录仅仅使用了59 同时项目服务的后台不停的有日志打印 而且测试的小伙伴说系统登录不上去了 下面记录一下个人排查并解决这个问题的全过
  • 解决电脑无法通过网线直连海康摄像机的问题

    一 现象 通过博主的另外一篇博客https blog csdn net u014552102 article details 86700057 配置完海康网络摄像机后 摄像机可以通过路由器wifi传输视频声音 并通过手机客户端和电脑客户端播
  • VUE项目本地运行调试遇到问题,npm run,install 报错

    IDE 随意选择 太多了 VSCode webstorm 一 安装node js npm vue cli 这三个东西教程挺多的 我这里就不详细说了 我之前开发的时候安装过 查看当前电脑上有没有安装 注意V的大小写 node v npm v
  • Vue.js怎么给文本域赋默认值,和获取输入的值

    Vue js怎么给文本域赋默认值 一般给文本域赋初值用于修改某个东西 需要获取默认值 可以用v model来完成
  • Sublime Text 3 文本编辑器软件

    为什么80 的码农都做不了架构师 gt gt gt http www xiazaiba com html 24343 html Sublime Text 2 设置文件详解 http linux cn article 799 1 html S
  • 45类商标分类表明细表

    商标注册分类采用的是尼斯分类 尼斯联盟成员国采用 商标注册用商品和服务国际分类 尼斯分类将商品和服务分成45个大类 其中商品为1 34类 服务为35 45类 商标局将尼斯分类的商品和服务项目划分类似群 并结合实际情况增加我国常用商品和服务项
  • SpringBoot使用多数据源时怎么解决事务不生效问题

    在使用多数据源时 如果不进行特殊处理 可能会出现事务不生效的问题 这是因为 Spring Boot 默认只会为一个数据源创建一个事务管理器 如果要使用多个数据源 就需要为每个数据源创建一个事务管理器 并在需要使用事务的方法或类上指定使用哪个
  • Istio Pilot源码学习(二):ServiceController服务发现

    本文基于Istio 1 18 0版本进行源码学习 4 服务发现 ServiceController ServiceController是服务发现的核心模块 主要功能是监听底层平台的服务注册中心 将平台服务模型转换成Istio服务模型并缓存
  • linux环境下设置用户密码过期期限

    关于密码过期时间和用户过期时间的设置 通常使用chage命令和usermod命令 设置某个用户的过期时间 accountexpires 可以用usermod e来设置 查看某个用户的密码 passwordexpires 过期时间等信息 可以
  • Java里Controller层参数不必填

    public Result
  • KNN算法的一个回归应用分析

    介绍 在我所接触的机器学习算法中 KNN是一种相对来说较容易理解的算法 但是它在实际中仍有十分广泛的应用 KNN算法可以用于分类和回归问题 在分类问题中应用较多 虽然KNN很少用于回归问题 但对于连续的变量仍有很好的效果 下面我们来介绍KN
  • 一篇打通,pytest自动化测试框架详细,从0到1精通实战(一)

    前言 pytest单元测试框架 1 什么是单元测试框架 单元测试是指在软件开发当中针对软件的最小单位 函数 方法 进行正确性的检查测试 2 单元测试框架有哪些 Java junit 和 testing python unittest 和 p
  • 整理了一些常用的免费api接口,不限次数,收藏备用~(持续更新...)

    API Application Program Interface 被定义为应用程序可用以与计算机操作系统交换信息和命令的标准集 一个标准的应用程序界面为用户或软件开发商提供一个通用编程环境 以编写可交互运行于不同厂商计算机的应用程序 AP
  • ISP_matlab

    确定输入是否为结构体数组字段 MATLAB isfield MathWorks 中国 对话框打开文件 获取路径和文件名 file path uigetfile raw RAW fid fopen fullfile path file htt
  • 百度通用翻译api使用

    官方api文档 http api fanyi baidu com api trans product apidoc springboot demo地址 https github com Blankwhiter translate 第一步 注