在自我学习的过程中,和项目中,使用到了retrofit+rxjava访问接口,记录一下自己的学习过程,可能有不准确或者不到位的地方,请大家多指正,嘻嘻!!!

一、什么是Retrofit?

1、Retrofit的定义

Retrofit是android的网络请求库,是一个RESTful的HTTP网络请求框架的封装(基于okhttp)。它内部网络请求的工作,本质上是通过OkHttp完成,而Retrofit仅负责网络请求接口的封装。

2、具体的流程

客户端通过Retrofit访问网络,实际上是通过Retrofit的接口封装了访问参数即我们所说的网址URL,接着通过okhttp去完成后面的请求工作。在服务端返回数据之后,OkHttp将原始的结果传递给Retrofit,Retrofit根据客户端的相关配置,将结果进行解析回调给客户端。

APP应用—→retrofit—→okhttp—→服务器(查到数据并返回)—→okhttp—→retrofit—→APP应用

3、Retrofit的作用

retrofit它将网络请求的参数通过注解配置进行封装,它支持同步、异步两种网络请求,支持多种数据格式的解析与序列化(如平时用的比较多的json、gson、xml等等),支持Rxjava。一般我们在使用的网络的请求的时候都应该先想到它。

二、怎么用retrofit?

1、在manifest里面添加网络请求

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

2、添加依赖(需要添加okhttp的库和retrofit自己的库)

    implementation 'com.squareup.okhttp3:okhttp:3.9.1'
    implementation 'com.squareup.retrofit2:retrofit:2.4.0'
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

3、创建服务器返回的数据类

这个根据定义的规则和数据解析类型(xml格式、json格式),自己定义类。下面这个网站是把json格式转成实体类 json在线转成实体类

举个例子,访问接口给我返回的是json格式的数据如左下图,右下图为其对应的树 在这里插入图片描述在这里插入图片描述
(1)首先我们新建一个PelpleBean类。转换也挺简单的,一个对象对应一个类,相同的格式的数据就用对象数组转换就可以了。

public class PelpleBean{
    public Head head;
    public Content content;

    public Head getHead() {
        return head;
    }

    public void setHead(Head head) {
        this.head = head;
    }

    public class Head {
        private String cmd;

        private String result;

        private String describle;

        public void setCmd(String cmd) {
            this.cmd = cmd;
        }

        public String getCmd() {
            return this.cmd;
        }

        public void setResult(String result) {
            this.result = result;
        }

        public String getResult() {
            return this.result;
        }

        public void setDescrible(String describle) {
            this.describle = describle;
        }

        public String getDescrible() {
            return this.describle;
        }
    }

    public class Content {
        public PeopleData[] data;
    }
}

(2)由于content的data里返回的是相同格式的数据,所以这种我一般喜欢分开来写,即创建一个PelpleData类,存放一些个体的特征。

public class PeopleData {
    private int i_id;

    private String p_name;

    private int p_age;

    private double p_height;

    public int getI_id() {
        return i_id;
    }

    public void setI_id(int i_id) {
        this.i_id = i_id;
    }

    public String getP_name() {
        return p_name;
    }

    public void setP_name(String p_name) {
        this.p_name = p_name;
    }

    public int getP_age() {
        return p_age;
    }

    public void setP_age(int p_age) {
        this.p_age = p_age;
    }

    public double getP_height() {
        return p_height;
    }

    public void setP_height(double p_height) {
        this.p_height = p_height;
    }

    @Override
    public String toString() {
        return "PeopleData{" +
                "i_id=" + i_id +
                ", p_name='" + p_name + '\'' +
                ", p_age=" + p_age +
                ", p_height=" + p_height +
                '}';
    }
}

这样对应的数据类就创建好啦,是不是还挺简单的。

4、创建注解,即用于描述网络请求的接口

retrofit是使用注解来描述网络请求的参数的,所以创建一个RetrofitService接口
在这里插入图片描述
在我用到的地方是用的post请求,表单的形式。当你请求的接口网址为

//这里网址我就随便写个了,主要是为了将其和注解接口对应起来
http://111.111.111.111:8089/PeopleApp?req=

我们可以把http://111.111.111.111:8089/抽取成公共的,即BaseURL,方便以后根据不同的ip地址调试

public interface RetrofitService {
  	// 注解里传入 网络请求的部分URL地址
    // Retrofit把网络请求的URL分成了两部分:一部分放在Retrofit对象里,另一部分放在网络请求接口里
    // 如果接口里的url是一个完整的网址,那么放在Retrofit对象里的URL可以忽略
    // getPeopleInfo()是接受网络请求数据的方法
    @FormUrlEncoded
    @POST("PeopleApp")
    //call
    Call<PeopleBean> getPeopleInfo(@Field("req") String param);
}

好了,前面的准备工作都已经准备就绪,接下来就到了具体的访问怎么访问了。

5、访问的具体逻辑

接下的就是在你需要用到的地方使用他就可以了,我们这里有个GetPeopleInfoActivity类去访问这个接口

public class GetPeopleInfoActivity extends AppCompatActivity {

    private List<PeopleData> peopleDataLists = new ArrayList<>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        request();
        // 使用Retrofit封装的方法
    }

    private void request() {
    //1、第一步拼接req的请求的json数据字符串
        JSONObject json_param = null;
        JSONObject json_content = new JSONObject();
	//这个拼接我就不讲怎么拼接了
        try {
            json_param = JsonUtils.getJsonParam(this, "get_people_info", json_content);
        } catch (JSONException e) {
            e.printStackTrace();
        }
        
        //2、创建retrofit对象
        Retrofit retrofit = new Retrofit.Builder()
                .baseUrl(Constant.BASE_URL)
                .addConverterFactory(GsonConverterFactory.create())
                .build();
                
        // 3、创建网络请求接口的实例
        RetrofitService request = retrofit.create(RetrofitService.class);
        
        //4、对发送请求进行封装(即req的内容)
        Call<PeopleBean> call = request.getPeopleInfo(json_param.toString());
        
        //5、发送网络请求(异步)
        call.enqueue(new Callback<PeopleBean>() {
        
        //请求成功时回调
            @Override
            public void onResponse(Call<PeopleBean> call, Response<PeopleBean> response) {
            //这里的response就是返回的内容,然后访问你想访问的内容即可
                PeopleData[] peopledata = response.body().content.data;
                peopleDataLists.clear();
                for (PeopleData peo : peopledata) {
                    peopleDataLists.add(peo);
                }
                Log.e("TAG", "获取到的信息:  " + peopleDataLists);

            }
		//请求失败时回调
            @Override
            public void onFailure(Call<PeopleBean> call, Throwable t) {
                Log.e("TAG", "连接失败:  ");
            }
        });
    }
}

然后运行一下程序就大工告成啦!!!是不是还挺简单的呢。

retrofit+rxjava的内容后面有时间会更新上来的,嘻嘻~~~~

三、什么是rxjava?

四、rxjava+retrofit怎么用?

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐