用OkHttp和Gson写一个借用有道翻译的app

不就前刚用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数据时复杂了点

扫描二维码关注公众号,回复: 2960458 查看本文章

注意:

像使用OkHttp要有okhttp.jar和okio.jar这两个jar包

记得添加android.permission.INTERNET权限,

url是在network的post中去找,而不是url栏中的,和之前在python中所说的一样要去掉url中的_o

猜你喜欢

转载自blog.csdn.net/Tz_AndHac/article/details/81381213