Retrofit的官方文档前面我已经把现在最为流行三个网络框架的其中两个volley和Okhttp3撸了一遍,接下来我就把最后的一个Retrofit2也撸一下。最近也搞了一下Android SDK开发的事,发现网上对于Android SDK开发的资料真的很少。到时我会把这个框架的功能集成到一个Jar包上,做一个简单的SDK开发来让大家也了解一下。
我们先来了解一下Retrofit2这个网络框架,准确来说Retrofit是基于Okhttp3的官方封装一个网络框架。所以这个框架的使用跟Okhttp3非常的相似,如果你在此之前又看过我前面的OKhttp3的教程或者其他人的教程的话,接下来的内容你就会更加的容易了解。
由于最近更新了Androidstudio3.0,便用这个编译环境来试水啦,不过使用原理都是一样的。首先我们先创建一个名为RetrofitDemo的项目,然后在app的gradle下添加Retrofit的依赖包。如下:
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
然后我们尝试做这样一个功能,当我们点击一个GET按钮时就向服务端发送一个GET请求,然后我们把返回来的结果通过吐司展示出来。当我们点击一个POST按钮就向服务端发送一个POST请求,也把返回来的结果吐司展现。XML布局如下:
<Button
android:layout_margin="10dp"
android:id="@+id/btn_login_get"
android:text="GET登录"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
<Button
android:layout_margin="10dp"
android:id="@+id/btn_login_post"
android:text="POST登录"
android:layout_width="match_parent"
android:layout_height="wrap_content" />
接下来我们创建一个名为Api的接口,这是根据Retrofit的官方文档的格式来定义。接口代码如下:
public interface Api {
@GET("写上你要访问的地址")//GET请求注释
Call<ResponseBody> getUserInfo();
@POST("写上你要访问的地址")//POST请求注释
Call<User> postSubmit (@Body User user);
}
主函数里,因为我们的POST请求是以JSON的格式来返回数据的,所以我们要先在app.gradle里添加GSON依赖,代码如下:
implementation 'com.squareup.retrofit2:converter-gson:2.4.0'
接下来我们分别为两个按钮添加点击事件,并调用刚才定义接口的GET和POST方法来验证是否能够正常访问我们需要访问的地址,并进行吐司,最后还要在AndroidManifest里面注册网络权限。主函数代码如下:
private Button btn_login_get,btn_login_post;
private Api api;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
btn_login_get = findViewById(R.id.btn_login_get);
btn_login_post = findViewById(R.id.btn_login_post);
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("写上你要访问的基地址如:http://127.0.0.1:8080/")
.addConverterFactory(GsonConverterFactory.create())//通过Gson的格式来解析数据
.build();
api = retrofit.create(Api.class);
btn_login_post.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
User user = new User();
user.setMoyo_sdk_name("admin");
user.setMoyo_sdk_pwd("123456");
api.postSubmit(user).enqueue(new Callback<User>() {//调用了我们在接口上定义的POST方法postSubmit(请求类型) Callback(返回类型)
@Override
public void onResponse(Call<User> call, Response<User> response) {
String name = response.body().getMoyo_sdk_name();
String password = response.body().getMoyo_sdk_pwd();
int code = response.body().getCode();
Toast.makeText(MainActivity.this,"name:"+name+"password:"+password+"code:"+code,Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(Call<User> call, Throwable t) {
}
});
}
});
btn_login_get.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//此部分为不简写,适合新手查看原理
// Call<ResponseBody> call = api.getUserInfo();
//
// call.enqueue(new Callback<ResponseBody>() {
// @Override
// public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//
// try {
// String msg = response.body().string();
// Toast.makeText(MainActivity.this,msg,Toast.LENGTH_LONG).show();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
//
// @Override
// public void onFailure(Call<ResponseBody> call, Throwable t) {
//
// }
// });
//
api.getUserInfo().enqueue(new Callback<ResponseBody>() {//调用了接口上的GET方法getUserInfo()
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
try {
String result = response.body().string();
Toast.makeText(MainActivity.this,result,Toast.LENGTH_LONG).show();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
}
});
}
在我们处理数据的时候我们可以选择创建一些Bean类,因为每个人请求的后台所得到的数据都不一样我就不把我的Bean类的源码粘贴出来了。在官方文档中还有很多的提交形式,有兴趣的可以去了解一下。我这里算了抛砖引玉,如果有什么错误的地方欢迎各位提出来一个探讨。
原创:https://blog.csdn.net/weixin_40600325/article/details/81639593