不就前刚用Python写的一个借用有道翻译的小翻译器,是用自带的urllib.request, urllib.parse 和 json实现的,
这次尝试在android studio里写一个app,利用Okhttp 和Gson也实现了,记得添加好jar包,以下主要体现代码:
private void sendRequestWithOkHttp(){
new Thread(new Runnable() {
@Override
public void run() {
try{
OkHttpClient client = new OkHttpClient();
RequestBody requestBody = new FormBody.Builder()
.add("i",et_main_content.getText().toString())//et_main_content是一个EditView,翻译其中的内容
.add("from","AUTO")
.add("to","AUTO")
.add("smartresult","dict")
.add("client","fanyideskweb")
.add("salt","1533033193171")
.add("sign","1f11a8e285dd9e2224ea4e7b711ab987")
.add("doctype","json")
.add("version","2.1")
.add("keyfrom","fanyi.web")
.add("action","FY_BY_REALTIME")
.add("typoResult","false")
.build();
Request request = new Request.Builder()
.url(url)//url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
.post(requestBody)
.removeHeader("User-Agent")
.addHeader("User-Agent","Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36")//伪装头,虽然没有这些也能成功
.build();
Response response = client.newCall(request).execute();
final String resutlt = getResult(response);
runOnUiThread(new Runnable() {//在UI线程中,在tv_main_result这个TextView显示结果
@Override
public void run() {
tv_main_result.setText(resutlt);
}
});
}catch (Exception e){
e.printStackTrace();
}
}
}).start();
}
private String getResult(Response response) throws IOException {
Gson gson = new Gson();
java.lang.reflect.Type type = new TypeToken<JsonBean>() {}.getType();
JsonBean jsonBean = gson.fromJson(response.body().string(), type);
Log.e("TAG",jsonBean.toString());
String result = jsonBean.getTranslateResult().get(0).get(0).getTgt();
return result;
}
以上是两个在MainActivity里的需要用的主要方法,当然还要记得写一个Bean类,可以直接利用insert + alt快捷键(要装GsonFormat插件)将
{'type': 'ZH_CN2EN', 'errorCode': 0, 'elapsedTime': 1, 'translateResult': [[{'src': '中国', 'tgt': 'China'}]]}
这段json数据粘贴进去就能获得这个Bean类了,以下是我生成的Bean类,其中两个toString方法是我自己加的,如果没有自动生成的话直接复制这个就OK:
import java.util.List;
public class JsonBean {
@Override
public String toString() {
return "JsonBean{" +
"type='" + type + '\'' +
", errorCode=" + errorCode +
", elapsedTime=" + elapsedTime +
", translateResult=" + translateResult +
'}';
}
/**
* type : ZH_CN2EN
* errorCode : 0
* elapsedTime : 1
* translateResult : [[{"src":"中国","tgt":"China"}]]
*/
private String type;
private int errorCode;
private int elapsedTime;
private List<List<TranslateResultBean>> translateResult;
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public int getErrorCode() {
return errorCode;
}
public void setErrorCode(int errorCode) {
this.errorCode = errorCode;
}
public int getElapsedTime() {
return elapsedTime;
}
public void setElapsedTime(int elapsedTime) {
this.elapsedTime = elapsedTime;
}
public List<List<TranslateResultBean>> getTranslateResult() {
return translateResult;
}
public void setTranslateResult(List<List<TranslateResultBean>> translateResult) {
this.translateResult = translateResult;
}
public static class TranslateResultBean {
@Override
public String toString() {
return "TranslateResultBean{" +
"src='" + src + '\'' +
", tgt='" + tgt + '\'' +
'}';
}
/**
* src : 中国
* tgt : China
*/
private String src;
private String tgt;
public String getSrc() {
return src;
}
public void setSrc(String src) {
this.src = src;
}
public String getTgt() {
return tgt;
}
public void setTgt(String tgt) {
this.tgt = tgt;
}
}
}
总的来说,和python比起来,就是在获取json数据时复杂了点
注意:
像使用OkHttp要有okhttp.jar和okio.jar这两个jar包
记得添加android.permission.INTERNET权限,
url是在network的post中去找,而不是url栏中的,和之前在python中所说的一样要去掉url中的_o