盒子
盒子
文章目录
  1. GET
  2. POST
  3. 结合RxJava

Retrofit的使用

Retrofit是一个基于okhttp,通过注解配置请求参数,支持图片链接和上传,支持同步异步和RxJava的请求框架

Retrofit的使用步骤:

  1. 创建Retrofit实例
  2. 根据Retrofit对象获得接口请求类
  3. 调用对应的请求方法,获取返回的Call
  4. 通过call调用enqueue处理结果
1
2
3
4
implementation 'io.reactivex.rxjava2:rxjava:2.1.0'
implementation 'io.reactivex.rxjava2:rxandroid:2.0.1'
implementation 'com.squareup.retrofit2:retrofit:2.4.0'
implementation 'com.squareup.okhttp3:okhttp:3.11.0'
1
2
3
4
public interface Api {
@GET("top250")
Call<ResponseBody> getTop250();
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Call<ResponseBody> call= new Retrofit.Builder()
.baseUrl("https://api.douban.com/v2/movie/")
.build()
.create(Api.class)
.getTop250();
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
Log.d(TAG,"json:"+reponse.body().string());
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
Log.d(TAG,"error");
}
})

  • addConverterFactory
  • 添加Json解析器,可以将Json数据映射为Java对象

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public interface Api {
    @GET("top250")
    Call<MovieBean> getTop250();
    }
    Call<MovieBean> call= new Retrofit.Builder()
    .baseUrl("https://api.douban.com/v2/movie/")
    .addConverterFactory(GsonConverterFactory.create())
    .build()
    call.enqueue(new Callback<MovieBean>() {
    @Override
    public void onResponse(Call<MovieBean> call, Response<MovieBean> response) {
    Log.d(TAG,"json:"+reponse.body().getName());
    }
    @Override
    public void onFailure(Call<ResponseBody> call, Throwable t) {
    Log.d(TAG,"error");
    }
    })

    其中MovieBean是要解析成的java对象

    Gson解析器需要添加依赖

    1
    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'

    Json解析器

    GET

    1
    2
    @GET("top250")
    Call<ResponseBody> getTop250();

    将访问:

    1
    https://api.douban.com/v2/movie/top250
    1
    2
    @GET("top250/{action}")
    Call<ResponseBody> getTop250(@path("action")String action);

    url中的{action}将会被参数action代替

    1
    2
    @GET("top250")
    Call<ResponseBody> getTop250(@Query("start")String start,(@Query("count")String count);

    使用方法:

    getTop(1,30)

    1
    2
    @GET("top250")
    Call<ResponseBody> getTop250(@QueryMap Map<String,String> map);

    使用方法:

    1
    2
    3
    map.put("start","1");
    map.put("count","30");
    getTop250(map);

    将访问:

    1
    https://api.douban.com/v2/movie/top250?start=1&count=30

    POST

    1
    2
    3
    @FormUrlEncoded
    @POST("top250")
    Call<ResponseBody> getTop250();

    传参:

    1
    2
    3
    @FormUrlEncoded
    @POST("top250")
    Call<ResponseBody> getTop250(@Field("start")String start,@Field("count")String count);

    其中Field类似于Query

    传一个body对象:

    1
    2
    3
    @FormUrlEncoded
    @POST("top250")
    Call<ResponseBody> getTop250(@Body MovieBean body);

    替换Url中的参数@path与GET请求相同

    结合RxJava

    添加支持RxJava的依赖:

    1
    implementation 'com.squareup.retrofit2:adapter-rxjava2:2.4.0'

    添加该依赖后可获得RxJava2CallAdapterFactory类,通过addCallAdapterFactory方法可使Retrofit支持RxJava

    需要将Api.class中的Call getTop250();更改为Observable getTop250()

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    new Retrofit.Builder()
    .addConverterFactory(GsonConverterFactory.create())
    .baseUrl("https://api.douban.com/v2/movie/")
    .addCallAdapterFactory(RxJava2CallAdapterFactory.create())
    .build()
    .create(Api.class)
    .getTop250()
    .subscribeOn(Schedulers.io())
    .observeOn(AndroidSchedulers.mainThread())
    .subscribe(new Observer<ResponseBody>() {
    @Override
    public void onSubscribe(Disposable d) {}
    @Override
    public void onNext(ResponseBody responseBody) {}
    @Override
    public void onError(Throwable e) {}
    @Override
    public void onComplete() {}
    });
    支持一下
    扫一扫,支持Grooter
    • 微信扫一扫
    • 支付宝扫一扫