开始使用
retrofit本身是对网络请求的再封装,所以需要其它网络请求库的支持比如Okhttp
converter-gson是json的转换器
在app的build.gradle下添加依赖:
|
|
初始化Retrofit
新建Retrofit网络请求客户端,并进行配置
深度的配置可以传入OkhttpClient后面会提到部分
|
|
创建Get请求
Retrofit的请求都是通过创建接口,并通过方法上的注解获取需要的参数
@GET表示get请求方式,()内可以传入接口地址
@Query后接get请求的参数,将会拼接到地址后
@QueryMap后接一个map,map存放参数,适合参数较多的情况
Call是网络请求的操作对象,泛型指定了返回的数据类型
创建请求接口
1234567public interface DemoApi {"url")(Call<ResponseBody> get1(@Query("var1") String var1,@Query("var2") String var2);"url")(Call<ResponseBody> get2(@QueryMap Map<String, String> vars);}生成接口,获得Call对象
如果不想传递某个参数,参数值为null即可
12345678DemoApi demoApi = retrofit.create(DemoApi.class);//@QueryCall<ResponseBody> call = demoApi.get1("var1","var2");//@QueryMapMap<String, String> vars = new HashMap<>();vars.put("var1","var1");vars.put("var2","var2");Call<ResponseBody> call = demoApi.get2(vars);
创建post请求
@POST代表这个方法是post请求
@FormUrlEncoded表示将表单内的数据处理为键值对
@Field后接需要传递的参数
@FieldMap适用于参数较多的情况,可以放参数放到一个map中
创建请求接口
123456789public interface DemoApi {"url")(Call<ResponseBody> post1(@Field("var1") String var1,@Field("var2") String var2);}"url")(Call<ResponseBody> post2(@FieldMap Map<String, String> vars);生成接口,获得Call对象
12345678DemoApi demoApi = retrofit.create(DemoApi.class);//@FieldCall<ResponseBody> call = demoApi.post1("var1","var2");//@FieldMapMap<String, String> vars = new HashMap<>();vars.put("var1","var1");vars.put("var2","var2");Call<ResponseBody> call = demoApi.post2(vars);
如何请求
发起请求
同步请求
1Response<ResponseBody> response = call.execute();异步请求
12345678910111213141516171819call.enqueue(new Callback<ResponseBody>() {public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) {//请求成功//响应码 response.code()在[200..300)区间内if (response.isSuccessful()) {//数据只能读取一次Log.e(TAG, "onResponse: " + response.body().string());//第二次打印为空Log.e(TAG, "onResponse: " + response.body().string());//记得关闭回收资源response.body().close();}}public void onFailure(Call<ResponseBody> call, Throwable t) {}});每个请求对象只能请求一次,但是我们可以利用方法复制一份再请求
12Call<ResponseBody> clone = call.clone();clone.execute();
取消请求
|
|
:warning:注意:
|
|
其它注解
辅助作用,适用于post,get,可以混合使用
@Body
可以把参数封装成为一个对象,请求的时候传一个对象就可以了
注意不能可@FormUrlEncoded同时使用
|
|
@Path
根据传递的参数动态改变相对地址,例如分页,分类等
|
|
@Url
当我们的地址和basUrl没有关系的时候,可以传递一个完整的地址
|
|
@Headers
给请求添加请求头
|
|
上传文件
单张图片上传
@Multipart表示表单上传数据
@Part后接参数
- 请求接口
123(url)Call<ResponseBody> upload(@Part MultipartBody.Part img);- 创建参数和请求
1234567File file = new File(Environment.getExternalStorageDirectory(), "xxx.jpg");//构造请求体RequestBody requestBody = RequestBody.create(MediaType.parse("multipart/form-data"), file);MultipartBody.Part part = MultipartBody.Part.createFormData("img", file.getName(), requestBody);UploadApi uploadApi = retrofit.create(UploadApi.class);Call call = uploadApi.upload( part);多图以及文字上传
- 请求接口
123@Multipart@POST(url)Call<ResponseBody> upload(@Part() List<MultipartBody.Part> imgs,@Part String var);- 创建参数和请求
123456789101112131415List<MultipartBody.Part> parts = new ArrayList<>();File file1 = new File(Environment.getExternalStorageDirectory(), "1.jpg");File file2 = new File(Environment.getExternalStorageDirectory(), "2.jpg");//构造请求体RequestBody requestBody1 = RequestBody.create(MediaType.parse("multipart/form-data"), file1);MultipartBody.Part part1 = MultipartBody.Part.createFormData("img1", file1.getName(), requestBody1);RequestBody requestBody2 = RequestBody.create(MediaType.parse("multipart/form-data"), file2);MultipartBody.Part part2 = MultipartBody.Part.createFormData("img2", file2.getName(), requestBody2);parts.add(part1);parts.add(part2);UploadApi uploadApi = retrofit.create(UploadApi.class);Call call = uploadApi.upload(parts,"var");
强大的拦截器
拦截器其实是okhttp的扩展用法,所以拦截器都是给okhttpClien添加,然后把okhttpClient设置到retrofit
日志拦截器
官方提供了一个打印日志的库
添加依赖
1compile 'com.squareup.okhttp3:logging-interceptor:3.8.1'创建
123456HttpLoggingInterceptor logging = new HttpLoggingInterceptor();logging.setLevel(HttpLoggingInterceptor.Level.BODY);OkHttpClient client = new OkHttpClient.Builder().addInterceptor(logging).addInterceptor(new CustomerInterceptor()).build();设置
12345retrofit = new Retrofit.Builder().baseUrl("url").addConverterFactory(GsonConverterFactory.create()).client(client).build();
自定义拦截器,添加统一参数
自定义接口都是继承Retrofit的拦截器类然后自己改写
下面这个就是继承拦截器然后获取请求,在请求的基础上复制一个请求,给请求添加统一的参数
|
|
结语
这一次只是初步的记录了retrofit的简单使用,欢迎大家吐槽.
下一步应该了解如何与Rxjava的结合使用(没办法,现在你说你不会这两个都会感觉不好意思).