Retrofit2.0

什么是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> getMethod();

@Path的使用

//这种请求方式使用了 @Path 这个{pid}就相当于一个可变参数。具体的参数就是下面传递过来的id
//最终请求的网址就是:http://172.168.22.32/mall/category/product/{pid} 这里的pid就是传递过来的pid的值
@GET("category/product/{pid}")
Call getMethod1(@Path("pid") String pid);

@Query的使用

//这种请求方式使用了 @Query 这个就相当于是Get请求中的参数
//最终请求的网址就是:http://172.168.22.32/mall/category/product?pid='pid' 引号中的pid是传进来的参数
@GET("category/product")
Call> 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> getMethod3(@QueryMap Map map);

2、@Post 使用post请求来请求数据
post请求和get请求类似
@Post的使用

//最简单的一种方式,就是相当于在baseUrl后面拼接括号中的网址。(括号中不要以"/"开头)
//最终请求的网址就是:http://172.168.22.32/mall/category/product
@Post("category/product")
Call> postMethod();

@Body的使用

//使用@Body注解,意思就是后面传递过来的product对象就是post的请求体
@Post("category/product")
Call> postMethod(@Body Product product);

@FormUrlEncoded的使用(和Field、FieldMap配合使用)

//使用@FormUrlEncoded注解,表单上传,参数中使用的@Field参数就是从传递过来的数据中解析获取键值对和@Query类似。@Field和@Query的使用也是一样的,不过一个是体现在URL上,一个是在请求体。
@Post("category/product")
@FormUrlEncoded
Call> postMethod(@Field("username") String username, @Field("password") String password);

@Multipart使用

//使用@Multipart注解,用于文件上传使用@Part是单个文件上传,使用@PartMap是多文件上传。
@Multipart
@Post("category/product")
Call> postMethod(@Part MultipartBody.Part file);

三、使用Retrofit2联网

当接口封装好了,Retrofit对象也已经初始化了,使用起来就很简单了,就是使用不同方法的时候传递不同的参数就可以了。

//首先,使用retrofit对象的create方法,传入我们创建好的接口,就可以拿到接口的实例化对象
RequestNet requestNet = mRetrofit.create(RequestNet.class);
//使用拿到的接口实例化对象,调用我们想要调用的我们定义的方法,传入需要传递的数据,获取Call对象
Call call = requestNet.getMethod4(xxx);
//使用call的execute方法联网,获取联网之后的返回数据(这是同步方法)
Response execute = call.execute();
//或者使用enqueque方法联网(这是异步方法)
call.enqueue(new Callback() {
            @Override
            public void onResponse(Call call, Response response) {
                //这个responce.body就是我们声明接口方法的时候规定返回值类型的数据
                ResponseBody body = response.body();
               
            }

            @Override
            public void onFailure(Call 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() {
            @Override
            public void onResponse(Call call, Response response) {
               InputStream in = response.body().byteStream();
               //有了流之后自己做相应的保存操作
            }

            @Override
            public void onFailure(Call 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 getMethod1();

//添加依赖之后
@GET("data.json")
    Observable getMethod1();

到这里应该就能理解了,拿到Observable之后也就意味着可以给Observable订阅Subscribe了。

        RequestNet requestNet = mRetrofit.create(RequestNet.class);
        Observable observable = requestNet.getMethod1();
        observable.subscribeOn(Schedulers.io())
                  .observeOn(AndroidSchedulers.mainThread())
                  .subscribe(new Action1() {
            @Override
            public void call(ResponseBody responseBody) {
                try {
                    Log.i(TAG, "call: "+responseBody.string());
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        });

以上就是Retrofit2.0的简单用用法了。

你可能感兴趣的:(Retrofit2.0)