Android-Retrofit-2.0-Post与Get-请求有道词典翻译

Retrofit-2.0版本后,内置已经集成了OKHttp,在使用Retrofit的时候 看似是Retrofit去网络请求的 实际上Retrofit只是封装,所以不要以为Retrofit是网络请求框架,Retrofit是网络封装框架,封装网络请求接口,封装解析等操作, 真正请求还是交给了OKHttp

 


代码结构:

第一步:在app/build.gradle添加支持库:

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    /*implementation"org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"
    implementation 'com.android.support:appcompat-v7:28.0.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'*/

    implementation 'com.squareup.retrofit2:converter-gson:2.0.2' // 用Gson解析json的转换器
    implementation 'com.android.support:appcompat-v7:28.0.0'

    // Retrofit库
    implementation 'com.squareup.retrofit2:retrofit:2.0.2'

    // Okhttp库
    // compile 'com.squareup.okhttp3:okhttp:3.1.2'

}

 第二步:封装服务器响应后的Bean实体:

     2.1)封装POST响应后的Bean实体>>PostTranslation

package ldl.cn.ldldemo.post;

import java.util.List;

public class PostTranslation {

    /**
     * 以下这些字段为什么要这样写,是由于服务器规定的,内部Gson解析的时候会对应字段的,所以必须这样写
     */

    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;
    }

    /**
     * 定义结果Bean
     */
    public static class TranslateResultBean {

        /**
         * src = xue
         * tgt = sb
         */

        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;
        }
    }

}

  2.2)封装GET响应后的Bean实体>>GetTranslation

package ldl.cn.ldldemo.get;

public class GetTranslation {

    /**
     * 以下这些字段为什么要这样写,是由于服务器规定的,内部Gson解析的时候会对应字段的,所以必须这样写
     */

    private int status;

    public content content;

    private static class content {
        private String from;
        private String to;
        private String vendor;
        private String out;
        private int errNo;

        /***
         *  ------------- 新增toString(); 为了看日志
         */
        @Override
        public String toString() {
            return "content{" +
                    "from='" + from + '\'' +
                    ", to='" + to + '\'' +
                    ", vendor='" + vendor + '\'' +
                    ", out='" + out + '\'' +
                    ", errNo=" + errNo +
                    '}';
        }
    }


    /***
     *  ------------- 新增toString(); 为了看日志
     */
    @Override
    public String toString() {
        return "GetTranslation{" +
                "status=" + status +
                ", content=" + content +
                '}' + "\n static class content的toString():" + content.toString();
    }

}

 第三步:描述请求的接口Interface

   3.1:描述POST请求的接口 IRequest

package ldl.cn.ldldemo.post;

import retrofit2.Call;
import retrofit2.http.Field;
import retrofit2.http.FormUrlEncoded;
import retrofit2.http.POST;

public interface IRequest {

    @POST("translate?doctype=json&jsonversion=&type=&keyfrom=&model=&mid=&imei=&vendor=&screen=&ssid=&network=&abtest=")
    @FormUrlEncoded
    Call<PostTranslation> getCall(@Field("i") String targetSentence);
    //采用@Post表示Post方法进行请求(传入部分url地址)
    // 采用@FormUrlEncoded注解的原因:API规定采用请求格式x-www-form-urlencoded,即表单形式
    // 需要配合@Field使用

}

  3.2:描述GET请求的接口 IGetRequest

package ldl.cn.ldldemo.get;

import retrofit2.Call;
import retrofit2.http.GET;

/**
 * 请求接口
 */
public interface IGetRequest {

    @GET("ajax.php?a=fy&f=auto&t=auto&w=hello%20world")
    Call<GetTranslation> getCall();
    // 注解里传入 网络请求 的部分URL地址
    // getCall()是接受网络请求数据的方法
}

第四步:具体Post、Get 操作:

package ldl.cn.ldldemo;

import android.app.Activity;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.util.Log;
import android.view.View;

import ldl.cn.ldldemo.get.GetTranslation;
import ldl.cn.ldldemo.get.IGetRequest;
import ldl.cn.ldldemo.post.IRequest;
import ldl.cn.ldldemo.post.PostTranslation;
import retrofit2.Call;
import retrofit2.Callback;
import retrofit2.Response;
import retrofit2.Retrofit;
import retrofit2.converter.gson.GsonConverterFactory;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        init();
    }

    private void init() {

    }

    /**
     * POST-请求的方式
     * @param view
     */
    public void startPostRequest(View view) {

        /**
         * 创建Retrofit对象
         */
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fanyi.youdao.com/") // 在这里设置网络访问的URL
                .addConverterFactory(GsonConverterFactory.create()) // 在这里设置
                .build();

        /**
         * 创建网络请求接口
         */
        IRequest iRequest = retrofit.create(IRequest.class);
        Call<PostTranslation>  call = iRequest.getCall("study");
        call.enqueue(new Callback<PostTranslation>() {

            @Override
            public void onResponse(Call<PostTranslation> call, Response<PostTranslation> response) {
                // 代表请求成功
                Log.d("@@@@@@", "翻译的结果是:" + response.body().getTranslateResult().get(0).get(0).getTgt());
            }

            @Override
            public void onFailure(Call<PostTranslation> call, Throwable t) {
                // 代表请求失败
                Log.d("@@@@@@", "请求失败:" + t.getMessage());
            }
        });

    }

    /**
     * GET-请求的方式
     * @param view
     */
    public void startGetRequest(View view) {
        /**
         * 创建Retrofit
         */
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("http://fy.iciba.com/") // 设置网络请求的URL
                .addConverterFactory(GsonConverterFactory.create()) // 设置为Gson解析
                .build();

        /**
         * 创建网络请求接口实例
         */
        IGetRequest iGetRequest = retrofit.create(IGetRequest.class);

        /**
         * GET请求方式 请求
         */
        Call<GetTranslation> call = iGetRequest.getCall();

        // 采用异步
        call.enqueue(new Callback<GetTranslation>() {

            @Override
            public void onResponse(Call<GetTranslation> call, Response<GetTranslation> response) {
                // 代表请求成功
                Log.d("@@@", "request Success" + response.body().toString() + " \n");
            }

            @Override
            public void onFailure(Call<GetTranslation> call, Throwable t) {
                // 代表请求失败
                Log.d("@@@", "request Failure" + t.getMessage());
            }
        });
    }
}

activity的布局文件:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始执行Post"
        android:onClick="startPostRequest"
        />

    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="开始执行Get"
        android:onClick="startGetRequest"
        />

</LinearLayout>

执行结果:

猜你喜欢

转载自www.cnblogs.com/android-deli/p/10294480.html