使用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; } } }
再定义一个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()}") } }) }

浙公网安备 33010602011771号