使用Retrofit调用百度翻译API(Java与Kotlin)

  使用百度翻译API先要去官网申请账号,然后开通翻译服务,获取appid以及密钥。

Java版本

  先根据API文档提供的返回的JSON数据格式创建一个实体类,文件名为TranslateResult。代码如下:

import java.util.List;

public class TranslateResult {

    /**
     * from : zh
     * to : en
     * trans_result : [{"src":"苹果","dst":"apple"}]
     */

    private String from;
    private String to;
    private List<TransResultBean> trans_result;
    private String error_code;
    private String error_msg;

    public String getError_code() {
        return error_code;
    }

    public void setError_code(String error_code) {
        this.error_code = error_code;
    }

    public String getError_msg() {
        return error_msg;
    }

    public void setError_msg(String error_msg) {
        this.error_msg = error_msg;
    }

    public String getFrom() {
        return from;
    }

    public void setFrom(String from) {
        this.from = from;
    }

    public String getTo() {
        return to;
    }

    public void setTo(String to) {
        this.to = to;
    }

    public List<TransResultBean> getTrans_result() {
        return trans_result;
    }

    public void setTrans_result(List<TransResultBean> trans_result) {
        this.trans_result = trans_result;
    }

    public static class TransResultBean {
        /**
         * src : 苹果
         * dst : apple
         */

        private String src;
        private String dst;

        public String getSrc() {
            return src;
        }

        public void setSrc(String src) {
            this.src = src;
        }

        public String getDst() {
            return dst;
        }

        public void setDst(String dst) {
            this.dst = dst;
        }
    }
}
View Code

  再定义一个TransService接口:

public interface TransService {
    @GET("?from=en&to=zh")
    Call<TranslateResult> getData(@Query("q") String q, @Query("appid") String appid,
                                  @Query("salt") String salt, @Query("sign");
}

 

  注:之前一直忘记在GET请求体中加入问号符号,导致一直报缺少参数的错误(错误码:54000)。这里我将方法指定成了中文翻译为英文,可根据自己需要进行手动传参更改。

  标签的生成方法:

  首先是随机数,使用Random即可:

                Random r = new Random(1);
                salt = String.valueOf(r.nextInt(10000));

  然后是MD5加密算法,来源于网上:

    public String getMD5(String str) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(str.getBytes());
            return new BigInteger(1, md.digest()).toString(16);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

  最后是Retrofit提交请求并返回数据:

    //text是需要翻译的文本,appid和key是百度翻译提供的,salt是刚刚随机生成的数字,由它们组合起来生成sign。

    str = appid + text + salt + key;
    sign = getMD5(str);

String httpsStr = "https://fanyi-api.baidu.com/api/trans/vip/translate/"; retrofit = new Retrofit.Builder() .baseUrl(httpsStr) .addConverterFactory(GsonConverterFactory.create()) .build(); service = retrofit.create(TransService.class);
Call
<TranslateResult> call = service.getData(text, appid, salt, sign); call.enqueue(new Callback<TranslateResult>() { @Override public void onResponse(Call<TranslateResult> call, Response<TranslateResult> response) { tv.setText(response.body().getTrans_result().get(0).getDst()); } @Override public void onFailure(Call<TranslateResult> call, Throwable t) { Log.d(TAG, "onFailure: " + t.toString()); } });

 

Kotlin版本

  同样有三步,先定义TranslateResult实体类,:

data class TranslateResult(val from: String, val to: String, val trans_result: List<trans_Result>,
                      val error_code: String, val error_msg: String) {
    data class trans_Result(val src: String, val dst: String)
}

  然后创建TransService接口:

interface TransService {
    @GET("?from=en&to=zh")
    fun getuData(@Query("appid") appid: String,
                @Query("salt") salt: String,
                @Query("sign") sign: String,
                @Query("q") q: String) : Call<TranslateResult>
}

  然后在Activity中定义MD5加密方法:

    private fun getMD5(string: String): String {
        val md = MessageDigest.getInstance("MD5")
        md.update(string.toByteArray())
        return BigInteger(1, md.digest()).toString(16)
    }

  生成标签方法:

            text = edit.text.toString()
            salt = Random(1).nextInt(100).toString();
            str = appid + text + salt + key
            sign = getMD5(str)

  text是输入框信息。

  最后就是翻译方法了:

    private fun translate() {
        val retrofit = Retrofit.Builder()
            .baseUrl("https://fanyi-api.baidu.com/api/trans/vip/translate/")
            .addConverterFactory(GsonConverterFactory.create())
            .build()
        val service = retrofit.create(TransService::class.java)

        service.getuData(appid, salt, sign, text).enqueue(object : Callback<TranslateResult> {
            override fun onResponse(
                call: Call<TranslateResult>,
                response: Response<TranslateResult>,
            ) {
                val result = response.body()
                result?.let {
                    tv.text = result.trans_result.get(0).dst
                }
            }

            override fun onFailure(call: Call<TranslateResult>, t: Throwable) {
                Log.d(TAG, "onFailure: ${t.toString()}")
            }
        })
    }

 

posted @ 2022-03-30 17:00  PeacefulGemini  阅读(190)  评论(0)    收藏  举报
回顶部