Retrofit 是一个 RESTful 的 HTTP 网络请求框架的封装,网络请求的工作本质上是 OkHttp 完成,而 Retrofit 仅负责 网络请求接口的封装
添加依赖
1 2 3 4 5
| implementation 'com.squareup.retrofit2:retrofit:2.9.0' implementation 'com.squareup.retrofit2:converter-gson:2.9.0' implementation 'com.squareup.retrofit2:adapter-rxjava2:2.9.0'
implementation 'com.google.code.gson:gson:2.8.9'
|
创建接口
Retrofit将 Http请求 抽象成 Java接口:采用 注解 描述网络请求参数 和配置网络请求参数
1 2 3 4 5 6 7 8 9 10 11
| public interface GetRequest_Interface {
@GET("openapi.do?keyfrom=abc&key=2032414398&type=data&doctype=json&version=1.1&q=car") Call<Reception> getCall(@Field("name") String name); }
|
创建Retrofit实例
1 2 3 4 5
| Retrofit retrofit = new Retrofit.Builder() .baseUrl("http://fanyi.youdao.com/") .addConverterFactory(GsonConverterFactory.create()) .addCallAdapterFactory(RxJavaCallAdapterFactory.create()) .build();
|
发送请求
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| GetRequest_Interface request = retrofit.create(GetRequest_Interface.class);
Call<ResponseBody> call = request.getCall("");
call.enqueue(new Callback<ResponseBody>() { @Override public void onResponse(Call<ResponseBody> call, Response<ResponseBody> response) { try { Log.d(TAG, "onResponse: " + response.body().string()); } catch (IOException e) { e.printStackTrace(); } } @Override public void onFailure(Call<ResponseBody> call, Throwable throwable) { Log.d(TAG, "onFailure: "); } });
try { Response<ResponseBody> response = call.execute(); Log.d(TAG, "Sync: " + response.body().string()); } catch (IOException e) { e.printStackTrace(); }
|
注解
网络请求方法
1.@GET、@POST、@PUT、@DELETE、@HEAD分别对应 HTTP中的网络请求方式
2.@HTTP替换@GET、@POST、@PUT、@DELETE、@PATH、@HEAD、@OPTIONS注解的作用 及 更多功能拓展
具体使用:通过属性method、path、hasBody进行设置
1 2 3 4 5 6 7 8 9
|
@HTTP(method = "GET", path = "blog/{id}", hasBody = false) Call<ResponseBody> getCall(@Path("id") int id);
|
标记
- @FormUrlEncoded 请求体是一个Form表单
表示发送form-encoded的数据,每个键值对需要用@Filed来注解键名,随后的对象需要提供值。
- @Multipart 请求体是一个支持文件上传的Form表单
表示发送form-encoded的数据(适用于 有文件 上传的场景),每个键值对需要用@Part来注解键名,随后的对象需要提供值。
- @Streaming 返回的数据以流的形式返回 用于返回数据较大的场景 (如果没有使用该注解,默认把数据全部载入内存,之后存取数据也是从内存中读取)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| public interface GetRequest_Interface {
@POST("/form") @FormUrlEncoded Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);
@POST("/form") @Multipart Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
}
|
网络请求参数
- @Header & @Headers
添加请求头 & 添加不固定的请求头1 2 3 4 5 6 7 8 9 10 11 12 13
| @GET("user") Call<User> getUser(@Header("Authorization") String authorization)
@Headers("Authorization: authorization") @GET("user") Call<User> getUser()
|
- @Body
以 Post方式 传递 自定义数据类型 给服务器,如果提交的是一个Map,那么作用相当于 @Field,不过Map要经过 FormBody.Builder 类处理成为符合 Okhttp 格式的表单,如:1 2
| FormBody.Builder builder = new FormBody.Builder(); builder.add("key","value");
|
- @Field & @FieldMap
发送 Post请求 时提交请求的表单字段,与 @FormUrlEncoded 注解配合使用1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public interface GetRequest_Interface {
@POST("/form") @FormUrlEncoded Call<ResponseBody> testFormUrlEncoded1(@Field("username") String name, @Field("age") int age);
@POST("/form") @FormUrlEncoded Call<ResponseBody> testFormUrlEncoded2(@FieldMap Map<String, Object> map);
}
|
- @Part & @PartMap
发送 Post请求 时提交请求的表单字段,与@Field的区别:功能相同,但携带的参数类型更加丰富,包括数据流,所以适用于 有文件上传 的场景,与 @Multipart 注解配合使用1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| public interface GetRequest_Interface {
@POST("/form") @Multipart Call<ResponseBody> testFileUpload1(@Part("name") RequestBody name, @Part("age") RequestBody age, @Part MultipartBody.Part file);
@POST("/form") @Multipart Call<ResponseBody> testFileUpload2(@PartMap Map<String, RequestBody> args, @Part MultipartBody.Part file);
@POST("/form") @Multipart Call<ResponseBody> testFileUpload3(@PartMap Map<String, RequestBody> args); }
|
- @Query和@QueryMap
用于 @GET 方法的查询参数(Query = Url 中 ‘?’ 后面的 key-value)
如:url = http://www.println.net/?cate=android,其中,Query = cate
配置时只需要在接口方法中增加一个参数即可:1 2 3 4
| @GET("/") Call<String> cate(@Query("cate") String cate);
|
- @Path
URL地址的缺省值1 2 3 4 5 6 7
| public interface GetRequest_Interface {
@GET("users/{user}/repos") Call<ResponseBody> getBlog(@Path("user") String user ); }
|
- @Url
直接传入一个请求的 URL变量 用于URL设置1 2 3 4 5 6 7 8
| public interface GetRequest_Interface {
@GET Call<ResponseBody> testUrlAndQuery(@Url String url, @Query("showAll") boolean showAll);
}
|