什么是Retrofit:
Retrofit和okhttp一样都是Square公司开发的现在非常流行的网络框架,Retrofit默认使用的还是OkhttpClient。
需要使用Retrofit2需要依赖如下库
compile 'com.squareup.retrofit2:retrofit:2.1.0'
//这个依赖是应为Retfofit2中支持内不添加一个解析器,不仅仅可以是Gson,也可以是其他的xml解析等。
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
//这个依赖就是Retrofit支持Rxjava所需要的Adapter
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
compile 'io.reactivex:rxjava:1.1.2'
compile 'io.reactivex:rxandroid:1.1.0'
一、创建Retrofit对象
//创建Retrofit对象
Retrofit retrofit = new Retrofit.Builder()
//指定使用的client(非必要),这行代码可以不写。默认就是OkHttpClient
.client(new OkHttpClient())
//指定要去访问的baseUrl 会和后面将要访问的网址做拼接(Retrofit2.0以后baseurl以"/"结束 要不然会报如下异常 Caused by: java.lang.IllegalArgumentException: baseUrl must end in / )
.baseUrl("http://172.168.22.32/mall/")
//设置一个解析获取到的数据的解析器(非必须)
.addConverterFactory(GsonConverterFactory.create())
//和Rxjava结合使用。可以使返回值为Observable对象(非必须)
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
二、定义接口
我们使用Retrofit的时候需要定义一个接口,封装一些方法来通过这些方法获取数据。
然后使用Retrofit对象来实例化这个接口以及其中的方法。
Retrofit中使用的是注解。通过注解来定义请求类型以及一些请求体。
下面介绍一些接口中方法的定义以及注解的使用。
1、@Get 使用get请求来请求数据
@Get的使用
//最简单的一种方式,就是相当于在baseUrl后面拼接括号中的网址。(括号中不要以"/"开头)
//最终请求的网址就是:http://172.168.22.32/mall/category/product
@GET("category/product")
Call<List<Product>> getMethod();
@Path的使用
//这种请求方式使用了 @Path 这个{pid}就相当于一个可变参数。具体的参数就是下面传递过来的id
//最终请求的网址就是:http://172.168.22.32/mall/category/product/{pid} 这里的pid就是传递过来的pid的值
@GET("category/product/{pid}")
Call<Product> getMethod1(@Path("pid") String pid);
@Query的使用
//这种请求方式使用了 @Query 这个就相当于是Get请求中的参数
//最终请求的网址就是:http://172.168.22.32/mall/category/product?pid='pid' 引号中的pid是传进来的参数
@GET("category/product")
Call<List<Product>> getMethod2(@Query("pid") String pid);
@QueryMap的使用
//这种请求方式使用了 @QueryMap 这个和 @Query 和类似只不过是这个中有很多个参数
//最终请求的网址就是:http://172.168.22.32/mall/category/product?xxx='xxx'&xxx='xxx' ... 这些xxx就是map中的key和value
@GET("category/product")
Call<List<Product>> getMethod3(@QueryMap Map<String,String> map);
2、@Post 使用post请求来请求数据
post请求和get请求类似
@Post的使用
//最简单的一种方式,就是相当于在baseUrl后面拼接括号中的网址。(括号中不要以"/"开头)
//最终请求的网址就是:http://172.168.22.32/mall/category/product
@Post("category/product")
Call<List<Product>> postMethod();
@Body的使用
//使用@Body注解,意思就是后面传递过来的product对象就是post的请求体
@Post("category/product")
Call<List<Product>> postMethod(@Body Product product);
@FormUrlEncoded的使用(和Field、FieldMap配合使用)
//使用@FormUrlEncoded注解,表单上传,参数中使用的@Field参数就是从传递过来的数据中解析获取键值对和@Query类似。@Field和@Query的使用也是一样的,不过一个是体现在URL上,一个是在请求体。
@Post("category/product")
@FormUrlEncoded
Call<List<Product>> postMethod(@Field("username") String username, @Field("password") String password);
@Multipart使用
//使用@Multipart注解,用于文件上传使用@Part是单个文件上传,使用@PartMap是多文件上传。
@Multipart
@Post("category/product")
Call<List<Product>> postMethod(@Part MultipartBody.Part file);
三、使用Retrofit2联网
当接口封装好了,Retrofit对象也已经初始化了,使用起来就很简单了,就是使用不同方法的时候传递不同的参数就可以了。
//首先,使用retrofit对象的create方法,传入我们创建好的接口,就可以拿到接口的实例化对象
RequestNet requestNet = mRetrofit.create(RequestNet.class);
//使用拿到的接口实例化对象,调用我们想要调用的我们定义的方法,传入需要传递的数据,获取Call对象
Call<ResponseBody> call = requestNet.getMethod4(xxx);
//使用call的execute方法联网,获取联网之后的返回数据(这是同步方法)
Response<ResponseBody> execute = call.execute();
//或者使用enqueque方法联网(这是异步方法)
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
//这个responce.body就是我们声明接口方法的时候规定返回值类型的数据
ResponseBody body = response.body();
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
到这里,Retrofit2的简单使用就已经讲完了,当然如果要使用一些其他方法比如上传方法,所需要的参数需要自己创建出来创建方法如下:
File file = new File(Environment.getExternalStorageDirectory(), "xxx.png");
RequestBody photoRequestBody = RequestBody.create(MediaType.parse("image/png"), file);
MultipartBody.Part photo = MultipartBody.Part.createFormData("photos", "xxx.png", photoRequestBody);
Retrofit2对下载也有相应的注解@Streaming。不过具体的下载操作还是需要我们自己来做
call.enqueue(new Callback<ResponseBody>() {
@Override
public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {
InputStream in = response.body().byteStream();
//有了流之后自己做相应的保存操作
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
}
});
Retrofit2中还有很多很多注解,我们讲解的仅仅是常用的get post请求,如果想要了解跟多,请自行百度吧。
四、Retrofit和RxJava的结合
本文刚开始的时候依赖了一个库
//这个依赖就是Retrofit支持Rxjava所需要的Adapter
compile 'com.squareup.retrofit2:adapter-rxjava:2.1.0'
这里的依赖就是可以和RxJava结合使用的具体使用如下:
//创建一个支持RxJava的Retrofit对象
mRetrofit = new Retrofit.Builder().baseUrl("http://10.0.2.2:8080/zhbj/")
.addConverterFactory(GsonConverterFactory.create())
//添加RxJava依赖
.addCallAdapterFactory(RxJavaCallAdapterFactory.create())
.build();
这里创建好了之后,在声明接口的时候就和之前有一点点区别的,在之前的代码中声明出来的接口的返回值类型都是Call对象,添加RxJava依赖之后的返回值就可以是Observable对象:
//添加依赖之前
@GET("data.json")
Call<ResponseBody> getMethod1();
//添加依赖之后
@GET("data.json")
Observable<ResponseBody> getMethod1();
到这里应该就能理解了,拿到Observable之后也就意味着可以给Observable订阅Subscribe了。
RequestNet requestNet = mRetrofit.create(RequestNet.class);
Observable<ResponseBody> observable = requestNet.getMethod1();
observable.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Action1<ResponseBody>() {
@Override
public void call(ResponseBody responseBody) {
try {
Log.i(TAG, "call: "+responseBody.string());
} catch (IOException e) {
e.printStackTrace();
}
}
});
以上就是Retrofit2.0的简单用用法了。
网友评论