在自我学习的过程中,和项目中,使用到了retrofit+rxjava访问接口,记录一下自己的学习过程,可能有不准确或者不到位的地方,请大家多指正,嘻嘻!!!
Retrofit是android的网络请求库,是一个RESTful的HTTP网络请求框架的封装(基于okhttp)。它内部网络请求的工作,本质上是通过OkHttp完成,而Retrofit仅负责网络请求接口的封装。
客户端通过Retrofit访问网络,实际上是通过Retrofit的接口封装了访问参数即我们所说的网址URL,接着通过okhttp去完成后面的请求工作。在服务端返回数据之后,OkHttp将原始的结果传递给Retrofit,Retrofit根据客户端的相关配置,将结果进行解析回调给客户端。
APP应用—→retrofit—→okhttp—→服务器(查到数据并返回)—→okhttp—→retrofit—→APP应用
retrofit它将网络请求的参数通过注解配置进行封装,它支持同步、异步两种网络请求,支持多种数据格式的解析与序列化(如平时用的比较多的json、gson、xml等等),支持Rxjava。一般我们在使用的网络的请求的时候都应该先想到它。
<uses-permission android:name="android.permission.INTERNET"/>
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'
这个根据定义的规则和数据解析类型(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 +
'}';
}
}
这样对应的数据类就创建好啦,是不是还挺简单的。
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);
}
好了,前面的准备工作都已经准备就绪,接下来就到了具体的访问怎么访问了。
接下的就是在你需要用到的地方使用他就可以了,我们这里有个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的内容后面有时间会更新上来的,嘻嘻~~~~