Android中基于HTTP通信技术之有道翻译API使用

刚学到网络通信,使用HTTP 的get方法做了个翻译的功能。初学者,自己记录下,自娱自乐。

一、到有道翻译申请个key,以便使用它提供的API来获取翻译结果。

申请地址:点击打开链接

这是我申请的,直接用我的也可以:"http://fanyi.youdao.com/openapi.do?keyfrom=testHttpGet2015&key=118817694&type=data&doctype=xml&version=1.1&q=good"

二、代码编写

1、布局如下:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity">

    <EditText
        android:id="@+id/etWords"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="请输入要翻译的内容" />

    <Button
        android:id="@+id/btnTranslation"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="翻译" />
    <TextView
        android:text="结果如下:"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <ScrollView
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <TextView
            android:id="@+id/tvResult"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="" />
    </ScrollView>

</LinearLayout>
2、Manifest中添加INTERNET权限

<uses-permission android:name="android.permission.INTERNET" />

3、java代码

尝试以下几种通信方式:

(1)使用http的get方法


public class MainActivity extends Activity {

    private TextView tv;
    private EditText et;
    public static final String FULL_URL = "http://fanyi.youdao.com/openapi.do?keyfrom=testHttpGet2015&key=118817694&type=data&doctype=xml&version=1.1&q=";
    
    private List<String> textList = new ArrayList<>();
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tvResult);
        et = (EditText) findViewById(R.id.etWords);
        findViewById(R.id.btnTranslation).setOnClickListener(clickListener);
    }

    private View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textList.clear();
            tv.setText("");
            readYoudaoResult(FULL_URL + et.getText().toString());
        }
    };

    private void readYoudaoResult(String fullUrl) {
        new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    URL url = new URL(params[0]);
                    URLConnection connection = url.openConnection();
                    InputStream is = connection.getInputStream();
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    Document document = builder.parse(is);
                    Element element = document.getDocumentElement();
                    //基本解释
                    Node translation = element.getElementsByTagName("translation").item(0);
                    if (translation != null) {
                        textList.add(translation.getTextContent() + "\n");
                    }                    
                    //发音及翻译
                    Node ukPhonetic = element.getElementsByTagName("uk-phonetic").item(0);
                    if (ukPhonetic != null) {
                        textList.add("英式发音: [" + ukPhonetic.getTextContent() + "]\n");
                    }
                   Node usPhonetic = element.getElementsByTagName("us-phonetic").item(0);
                    if (usPhonetic != null) {
                        textList.add("美式发音: [" + usPhonetic.getTextContent() + "]\n");
                    }
                   Node explains = element.getElementsByTagName("explains").item(0);
                    if (explains != null) {
                        textList.add("基本释义:" + explains.getTextContent());
                    }
                    
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                for (String children : textList) {                    
                    tv.append(children);
                }
                super.onPostExecute(s);
            }
        }.execute(fullUrl);
    }
}

(2)使用http的post方法
public class MainActivity extends Activity {

    private TextView tv;
    private EditText et;
    public static final String TRANSLATE_URL = "http://fanyi.youdao.com/openapi.do";
    public static final String TRANSLATE_ENTITY = "keyfrom=testHttpGet2015&key=118817694&type=data&doctype=xml&version=1.1&q=";

    private List<String> textList = new ArrayList<>();
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tvResult);
        et = (EditText) findViewById(R.id.etWords);
        findViewById(R.id.btnTranslation).setOnClickListener(clickListener);
    }

    private View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textList.clear();
            tv.setText("");
            readYoudaoResult(TRANSLATE_URL, TRANSLATE_ENTITY + et.getText().toString());
        }
    };

    private void readYoudaoResult(String translateUrl, String translateEntity) {
        new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    URL url = new URL(params[0]);
                    HttpURLConnection connection = (HttpURLConnection) url.openConnection();
                    connection.setDoInput(true);
                    connection.setDoOutput(true);
                    connection.setRequestMethod("POST");
                    OutputStreamWriter osw = new OutputStreamWriter(connection.getOutputStream(), "utf-8");
                    BufferedWriter bw = new BufferedWriter(osw);
                    bw.write(params[1]);
                    bw.flush();
                    bw.close();
                    osw.close();

                    InputStream is = connection.getInputStream();
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    Document document = builder.parse(is);
                    is.close();
                    Element element = document.getDocumentElement();
                    //基本解释
                    Node translation = element.getElementsByTagName("translation").item(0);
                    if (translation != null) {
                        textList.add(translation.getTextContent() + "\n");
                    }                    
                    //发音及翻译
                    Node ukPhonetic = element.getElementsByTagName("uk-phonetic").item(0);
                    if (ukPhonetic != null) {
                        textList.add("英式发音: [" + ukPhonetic.getTextContent() + "]\n");
                    }
                   Node usPhonetic = element.getElementsByTagName("us-phonetic").item(0);
                    if (usPhonetic != null) {
                        textList.add("美式发音: [" + usPhonetic.getTextContent() + "]\n");
                    }
                   Node explains = element.getElementsByTagName("explains").item(0);
                    if (explains != null) {
                        textList.add("基本释义:" + explains.getTextContent());
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                for (String children : textList) {                    
                    tv.append(children);
                }
                super.onPostExecute(s);
            }
        }.execute(translateUrl, translateEntity);
    }
}

(3)使用httpClient的get方法

public class MainActivity extends Activity {

    private TextView tv;
    private EditText et;
    public static final String FULL_URL = "http://fanyi.youdao.com/openapi.do?keyfrom=testHttpGet2015&key=118817694&type=data&doctype=xml&version=1.1&q=";
    
    private List<String> textList = new ArrayList<>();
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tvResult);
        et = (EditText) findViewById(R.id.etWords);
        findViewById(R.id.btnTranslation).setOnClickListener(clickListener);
    }

    private View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textList.clear();
            tv.setText("");
            readYoudaoResult(FULL_URL + et.getText().toString());
        }
    };

    private void readYoudaoResult(String fullUrl) {
        new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {
                    String stringURL = params[0];
                    HttpGet get = new HttpGet(stringURL);
                    HttpResponse response = client.execute(get);
                    String buffer = EntityUtils.toString(response.getEntity());
                    InputStream is = new ByteArrayInputStream(buffer.getBytes("utf-8"));
                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    Document document = builder.parse(is);
                    Element element = document.getDocumentElement();
                    //基本解释
                    Node translation = element.getElementsByTagName("translation").item(0);
                    if (translation != null) {
                        textList.add(translation.getTextContent() + "\n");
                    }                    
                    //发音及翻译
                    Node ukPhonetic = element.getElementsByTagName("uk-phonetic").item(0);
                    if (ukPhonetic != null) {
                        textList.add("英式发音: [" + ukPhonetic.getTextContent() + "]\n");
                    }
                   Node usPhonetic = element.getElementsByTagName("us-phonetic").item(0);
                    if (usPhonetic != null) {
                        textList.add("美式发音: [" + usPhonetic.getTextContent() + "]\n");
                    }
                   Node explains = element.getElementsByTagName("explains").item(0);
                    if (explains != null) {
                        textList.add("基本释义:" + explains.getTextContent());
                    }
                    
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                for (String children : textList) {                    
                    tv.append(children);
                }
                super.onPostExecute(s);
            }
        }.execute(fullUrl);
    }
}

(4)使用httpClient的post方法

public class MainActivity extends Activity {

    private TextView tv;
    private EditText et;
    public static final String TRANSLATE_URL = "http://fanyi.youdao.com/openapi.do";
    public static final String KEY_FROM = "keyfrom";
    public static final String KEY_FROM_VALUE = "testHttpGet2015";
    public static final String KEY = "key";
    public static final String KEY_VALUE = "118817694";    
    public static final String TYPE = "type";
    public static final String TYPE_VALUE = "data";
    public static final String DOC_TYPE = "doctype";
    public static final String DOC_TYPE_VALUE = "xml";
    public static final String VERSION = "version";
    public static final String VERSION_VALUE = "1.1";
    public static final String TRANSLATE_TEXT = "q";
    private List<String> textList = new ArrayList<>();
    private HttpClient client;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        tv = (TextView) findViewById(R.id.tvResult);
        et = (EditText) findViewById(R.id.etWords);
        client = new DefaultHttpClient();
        findViewById(R.id.btnTranslation).setOnClickListener(clickListener);
    }

    private View.OnClickListener clickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            textList.clear();
            tv.setText("");
            readYoudaoResult(TRANSLATE_URL, et.getText().toString());
        }
    };

    private void readYoudaoResult(String translateUrl, String translateEntity) {
        new AsyncTask<String, Void, String>() {
            @Override
            protected String doInBackground(String... params) {
                try {

                    String stringURL = params[0];
                    HttpPost post = new HttpPost(stringURL);
                    List<BasicNameValuePair> list = new ArrayList<BasicNameValuePair>();
                    list.add(new BasicNameValuePair(KEY_FROM, KEY_FROM_VALUE));
                    list.add(new BasicNameValuePair(KEY, KEY_VALUE));
                    list.add(new BasicNameValuePair(TYPE, TYPE_VALUE));
                    list.add(new BasicNameValuePair(DOC_TYPE, DOC_TYPE_VALUE));
                    list.add(new BasicNameValuePair(VERSION, VERSION_VALUE));
                    list.add(new BasicNameValuePair(TRANSLATE_TEXT, params[1]));
                    post.setEntity(new UrlEncodedFormEntity(list));
                    HttpResponse response = client.execute(post);
                    String buffer = EntityUtils.toString(response.getEntity());
                    InputStream is = new ByteArrayInputStream(buffer.getBytes("utf-8"));

                    DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
                    DocumentBuilder builder = factory.newDocumentBuilder();
                    Document document = builder.parse(is);
                    is.close();
                    Element element = document.getDocumentElement();
                    //基本解释
                    Node translation = element.getElementsByTagName("translation").item(0);
                    if (translation != null) {
                        textList.add(translation.getTextContent() + "\n");
                    }
                    //发音及翻译
                    Node ukPhonetic = element.getElementsByTagName("uk-phonetic").item(0);
                    if (ukPhonetic != null) {
                        textList.add("英式发音: [" + ukPhonetic.getTextContent() + "]\n");
                    }
                    Node usPhonetic = element.getElementsByTagName("us-phonetic").item(0);
                    if (usPhonetic != null) {
                        textList.add("美式发音: [" + usPhonetic.getTextContent() + "]\n");
                    }
                    Node explains = element.getElementsByTagName("explains").item(0);
                    if (explains != null) {
                        textList.add("基本释义:" + explains.getTextContent());
                    }
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (ParserConfigurationException e) {
                    e.printStackTrace();
                } catch (SAXException e) {
                    e.printStackTrace();
                }
                return null;
            }

            @Override
            protected void onPostExecute(String s) {
                for (String children : textList) {                    
                    tv.append(children);
                }
                super.onPostExecute(s);
            }
        }.execute(translateUrl, translateEntity);
    }
}

4、运行结果截图






您可以按照以下步骤在Android Studio使用有道翻译API: 1. 创建一个新的Android Studio项目。 2. 在项目添加有道翻译API的依赖项。您可以在build.gradle文件添加以下依赖关系: ``` implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1' ``` 3. 在您的应用程序创建一个服务来处理网络请求。您可以使用Retrofit库创建一个服务。例如,以下代码片段显示如何使用Retrofit创建一个服务: ``` public interface TranslationService { @POST("api") @FormUrlEncoded Call<TranslationResponse> getTranslation(@Field("keyfrom") String keyFrom, @Field("key") String key, @Field("type") String type, @Field("doctype") String docType, @Field("version") String version, @Field("q") String text); } ``` 4. 在您的应用程序创建一个模型来解析API响应。例如,以下代码片段显示如何创建一个模型类TranslationResponse: ``` public class TranslationResponse { @SerializedName("translation") private List<String> translationList; public List<String> getTranslationList() { return translationList; } } ``` 5. 在您的应用程序,确保您已经获得与有道翻译API相关的API密钥。请不要在代码硬编码密钥。 6. 在您的应用程序,创建一种方法来处理翻译请求。此方法应该是异步的。例如,以下代码片段显示如何使用Retrofit处理翻译请求: ``` public void translate(String text) { TranslationService service = Retrofit.Builder() .baseUrl("http://fanyi.youdao.com") .addConverterFactory(GsonConverterFactory.create()) .build() .create(TranslationService.class); Call<TranslationResponse> call = service.getTranslation("your keyFrom", "your key", "data", "json", "1.1", text); call.enqueue(new Callback<TranslationResponse>() { @Override public void onResponse(Call<TranslationResponse> call, Response<TranslationResponse> response) { List<String> translationList = response.body().getTranslationList(); // 处理翻译结果 } @Override public void onFailure(Call<TranslationResponse> call, Throwable t) { // 处理失败情况 } }); } ``` 请注意,您需要将"your keyFrom"和"your key"替换为您的API密钥的值。 以上是在Android Studio使用有道翻译API的基本步骤。希望这能帮助到您。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值