Retrofit 官网地址: https://github.com/square/retrofitjava
Retrofit(即Retrofit,目前最新版本为2.6.0版本),是目前很是流行的网络请求框架,底层是基于okHttp实现的。准确来讲Retrofit是对okHttp的进一步封装,它功能强大,支持同步和异步,支持多种数据的解析方式(默认为Gson),支持RxJava。android
Retrofit 最大的优点就是简洁易用,它经过注解配置网络请求的参数,采用大量的设计模式来简化咱们的使用。并且它的拓展性也作的至关的好,Retrofit 的功能模块高度封装,高内聚低耦合,咱们能够自定义本身想要的组件,好比说咱们能够本身选择解析工具而不用默认的Gson。除此以外,Retrofit 还有诸如性能好,处理速度快,代码简化等优点。git
使用 Retrofit 前咱们不得不提一下注解,正是这些注解极大的方便了咱们的代码编写及逻辑流程的控制。github
Retrofit代码实现步骤以下:json
1)建立Retrofit 实例。设计模式
2)定义接口,使用注解的形式封装请求地址和请求参数api
3)经过Retrofit实例,获取一个接口服务对象服务器
4)经过接口服务对象调用接口中的方法,获取call对象网络
5)Call对象执行请求(异步请求、同步请求)app
因为Retrofit是基于OkHttp,因此还须要添加OkHttp库依赖,须要在build.grale添加以下依赖:
dependencies { // Okhttp库 compile 'com.squareup.okhttp3:okhttp:3.10.0' // Retrofit库 compile 'com.squareup.retrofit2:retrofit:2.6.0' }
添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
建立接收服务器返回数据的类:
public class Blog { // 根据返回数据的格式和数据解析方式(Json、XML等)定义 ... }
建立Retrofit实例时须要经过 Retrofit.Builder
,并调用baseUrl
方法设置URL。
Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://localhost:4567/") .build();
注意:Retrofit 的 baseUlr 必须以 /(斜线) 结束,否则会抛出一个IllegalArgumentException。
2. 定义接口定义请求接口的方式示例以下:
public interface BlogService { @GET("blog/{id}") Call<ResponseBody> getBlog(@Path("id") int id); }
注意这里的 interface
不是class
,因此咱们是没法直接调用该方法,咱们须要用Retrofit建立一个BlogService
的代理对象。
BlogService service = retrofit.create(BlogService.class);
拿到代理对象以后,就能够调用了。
调用方式的示例以下:
Call<ResponseBody> call = service.getBlog(2); // 经过call对象执行网络请求(同步请求execute,异步请求enqueue) call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable t) { t.printStackTrace(); } });
至此,使用Retrofit 就可以进行基本的网络请求了,若是须要更深层的使用,能够参考一下资料进行使用,后续咱们在对这些高级的使用方法进行一一整理。
添加Header有如下几种方式:
1. 使用注解的方式
添加一个Header参数
public interface UserService { @Headers("Cache-Control: max-age=640000") @GET("/tasks") Call<List<Task>> getTasks(); }
添加多个Header参数
public interface UserService { @Headers({ "Accept: application/vnd.yourapi.v1.full+json", "User-Agent: Your-App-Name" }) @GET("/tasks/{task_id}") Call<Task> getTask(@Path("task_id") long taskId); }
2. 使用代码的方式,则须要使用拦截器:
OkHttpClient.Builder httpClient = new OkHttpClient.Builder(); httpClient.addInterceptor(new Interceptor() { @Override public Response intercept(Interceptor.Chain chain) throws IOException { Request original = chain.request(); Request request = original.newBuilder().header("User-Agent", "Your-App-Name") .header("Accept", "application/vnd.yourapi.v1.full+json") .method(original.method(), original.body()).build(); return chain.proceed(request); } } OkHttpClient client = httpClient.build(); Retrofit retrofit = new Retrofit.Builder().baseUrl(API_BASE_URL) .addConverterFactory(GsonConverterFactory.create()).client(client).build();
3. 使用注解的方式,可是Header参数每次提交的都不一样,也就是动态的Header:
public interface UserService { @GET("/tasks") Call<List<Task>> getTasks(@Header("Content-Range") String contentRange); }
4. 使用注解Map方式,也就是将多个Header参数进行封装:
@GET("/search")
Call<ResponseBody> list(@HeaderMap Map<String, String> headers);
Form表单提交,后台服务器是以 键值对 的形式来接受参数的,因此Retrofit也很聪明,把接口参数经过Map的形式来提交。使用@FieldMap,@POST注解。
/** * 登陆 * post * 表单提交 * * @param map * @return */ @FormUrlEncoded @POST("login") Flowable<BaseDto<LoginDto>> login(@FieldMap Map<String, String> map);
Json提交就是能够把对象直接转换成Json字符串,提交到后台服务器。因此咱们直接传递整个对象便可。Retrofit会帮咱们把对象转换成Json,而后传递给后台服务器。使用@Body ,@POST注解。
/** * 签到详情 * * @param vo * @return */ @POST("sign/getDate") Flowable<BaseDto<SignDetailDto>> signGetDate(@Body SignDetailVo vo);
参考资料:
1. 博文:https://www.jianshu.com/p/308f3c54abdd
2. 实例代码:https://github.com/ikidou/Retrofit2Demo/tree/master/client/src/main/java/com/github/ikidou