1.简介
当前网络开源库有很多,比如Volley,Okhttp ,retrofit等,这些库在目前是比较火的网络请求框架,下面简单看看三种框架的基本用法
1.Volley无参请求
RequestQueue mRequestQueue = Volley.newRequestQueue(this);
JsonObjectRequest req = new JsonObjectRequest(url, null,
new Response.Listener<JSONObject>() {
@Override
public void onResponse(JSONObject response) {
/*
请求成功走的方法
*/
}
}, new Response.ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
/*
请求失败走的方法
*/
Log.e("onResponse: ", "error");
}
});
mRequestQueue.add(req);
2.Volley带参请求
Map<String, String> params = new HashMap<String, String>();
params.put("username", "root");
params.put("password", "123456");
JsonObjectRequest newMissRequest = new JsonObjectRequest(
Request.Method.POST //请求方式
, "http://127.0.0.1:8080/login", //请求地址
new JSONObject(params) //携带参数
, new Response.Listener<JSONObject>{
//成功方法
...
}
,new Response.ErrorListener(){
//失败方法
});
3.Okhttp无参请求:
new OkHttpClient()
.newCall(new Request.Builder()
.get() //默认是get请求 可以不写
.url(url)
.build())
.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
//失败的方法
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//成功的方法
}
});
4.Okhttp带参请求:
new OkHttpClient()
.newCall(new Request.Builder()
.url(url)
.post
(
new FormBody.Builder() //post请求
.add("root","root") //参数1
.add("password","123456")//参数2
.build()
)
.enqueue(new Callback() {
@Override
public void onFailure(@NotNull Call call, @NotNull IOException e) {
//失败的方法
}
@Override
public void onResponse(@NotNull Call call, @NotNull Response response) throws IOException {
//成功的方法
}
});
2.基本使用
1)、依赖导入
//Retrofit(网络请求框架)
//RxJava
implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
implementation 'io.reactivex.rxjava3:rxjava:3.0.0-RC7'
implementation 'com.squareup.retrofit2:adapter-rxjava2:2.7.1'
//Retrofit
implementation 'com.squareup.retrofit2:retrofit:2.7.1'
implementation 'com.squareup.retrofit2:converter-gson:2.7.1'
//rxlifecycle
implementation 'com.trello.rxlifecycle3:rxlifecycle:3.1.0'
implementation 'com.trello.rxlifecycle3:rxlifecycle-android:3.1.0'
implementation 'com.trello.rxlifecycle3:rxlifecycle-components:3.1.0'
//Retrofit动态设置baseUrl
implementation 'me.jessyan:retrofit-url-manager:1.4.0'
implementation 'androidx.cardview:cardview:1.0.0'
2)、简单介绍相关注解API(前后端约定RESTFul API用起来比较舒适~)
注解 | 描述 |
---|---|
@POST | 发送POST请求 |
@GET | 发送get请求 |
@PUT | 发送put请求 |
@DELETE | 发送DELETE请求 |
@Field | 发送带参请求时携带的参数(与@FormUrlEncoded一齐使用) |
@FormUrlEncoded | 标识表单数据请求(配合@Field一齐使用) |
@FieldMap | 通过键值对封装参数 |
@Url | 拼接地址 |
@Path | 用于传入占位符的参数 |
3)、搭建ApiService (用于定义自己需要发送的方法以及对象)
public interface ApiService {
@POST
Observable<LoginUser> findAll(@Url String url); //查询所有用户信息
@POST("login")
@FormUrlEncoded
Observable<ResponseBody> deleteUserAppointment(@Field("id") Integer id,@Field("pwd") String pwd);
//登录方法
}
4)、搭建RetrofitUtils(生成工具类配合RxJAVA使用)
public class RetrofitUtils {
private static ApiService apiService;
//单例模式
public static ApiService getApiService() {
if (apiService == null) {
synchronized (RetrofitUtils.class) {
if (apiService == null) {
apiService = getRetrofit().create(ApiService.class);
}
}
}
return apiService;
}
得到Retrofit
public static Retrofit getRetrofit() {
return new Retrofit.Builder()
.baseUrl(Constants.url) //动态设置url http://127.0.0.1/
.addCallAdapterFactory(RxJava2CallAdapterFactory.create()) //RxJAVA适配器
.addConverterFactory(GsonConverterFactory.create()) //Gson转换工厂
.client(getClient()) //设置客户端 打印日志信息
.build();
}
添加拦截器
private static OkHttpClient getClient() {
return new OkHttpClient.Builder()
.addInterceptor(Objects.requireNonNull(getInterceptor())) //添加拦截器
.build();
}
private static Interceptor getInterceptor() {
HttpLoggingInterceptor.Level level = HttpLoggingInterceptor.Level.BODY;
HttpLoggingInterceptor interceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
Log.i("请求参数信息:", message);
}
});
interceptor.setLevel(level);
return interceptor;
}
5)、搭建RxJAVA配合RetrofitUtils使用
[ 1 ].方法说明
方法 | 主要作用 |
---|---|
Observable< T> subscribeOn(Scheduler scheduler) | 用于开启子线程发送网路请求 |
< R> Observable< R> compose (ObservableTransformer<? super T, ? extends R> composer) | 用于绑定生命周期(但是需要继承RxAppCompatActivity类) |
Observable< T> repeatWhen(final Function<? super Observable< Object>, ? extends ObservableSource<?>> handler) | 带条件的重复执行函数 |
Observable< R> map(Function<? super T, ? extends R> mapper) | 可以将被观察者转换为其他任意类型 |
Observable< T> observeOn(Scheduler scheduler) | 切换线程,在主线程中接受数据 |
void subscribe(Observer<? super T> observer) | 订阅(一般写在最后 需要重写四个方法 【onSubscribe , onNext(处理数据) ,onError,onComplete】) |
[ 2 ].简单demo实现 Retrofit2 && RxJava 使用
补充:在实现Observer< T > 接口时,会重写四个方法,但是我们在中小型网络请求时,可能只会关心成功(onNext)和失败(onError)的方法,于是小编定义BaseObserver< T >类实现接口,自定义成功和失败方法:
public abstract class BaseObserver<T> implements Observer<T> {
protected abstract void onSuccess(T t);
protected abstract void onFailed(Throwable e);
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(T t) {
onSuccess(t);
}
@Override
public void onError(Throwable e) {
onFailed(e);
}
@Override
public void onComplete() {
}
}
被观察者订阅链:调用ApiService中的findAll()方法
RetrofitUtils.getApiService()
.findAll()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new BaseObserver<LoginUser>() {
@Override
protected void onSuccess(LoginUser loginUser) {
//此时是以及回到主线程了,可以对返回的数据进行直接使用了
...
}
@Override
protected void onFailed(Throwable e) {
//失败
...
}
}
另外:RxJAVA有很多的操作符,还有很多需要我们大家一起去学习和挖掘的地方,在不断的学习和完善后,再继续完善框架的使用