添加网络访问权限并引入依赖库
<uses-permission android:name="android.permission.INTERNET"/>
compile 'com.squareup.retrofit2:retrofit:2.1.0'
使用注解定义网络访问的API
[下列为使用方法]
- @GET 发送GET请求
- @PATH 替换请求url中用花括号括起的部分
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId);
- @Query 增加请求参数
?sort=...
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId,@Query("sort") String sort);
- @QueryMap 批量增加请求参数
@GET("group/{id}/users")
Call<List<User>> groupList(@Path("id") int groupId, @QueryMap Map<String, String> options);
Map<String,String> params =new HashMap<>(); params.put("param1","value1");
params.put("param2","value2");
Call<ResponseInfo> call = service.testHttpGet(params);
- @POST 发送post请求
- @Body 作为请求体发送对象(可以声明一个对象作为请求体发送到服务器)
@POST("users/new")
Call<User> createUser(@Body User user);
- 使用
@FormUrlEncoded
表明为表单提交
- 使用
@Field
(注解和参数来指定每个表单项的Key,value为参数的值)表单提交的域 - 使用
@FieldMap
批量增加表单提交的域
- 使用
@FormUrlEncoded
@POST("user/edit")
Call<User> updateUser(@Field("first_name") String first, @Field("last_name") String last);
- @Header 添加头部信息
@GET("user")
Call<User> getUser(@Header("Authorization") String authorization)
- @Headers 批量添加头部信息
@Headers("Cache-Control: max-age=640000")
@GET("widget/list")
Call<List<Widget>> widgetList();
@Headers({
"Accept: application/vnd.github.v3.full+json",
"User-Agent: Retrofit-Sample-App"
})
@GET("users/{username}")
Call<User> getUser(@Path("username") String username);
请求头不会相互覆盖,同名的请求头会被保留进请求
- 使用
@Multipart
一般用于文件上传
- 使用
@Part
(注解定义要发送的每个文件)表明不同的请求体
- 使用
@Multipart
@PUT("user/photo")
Call<User> updateUser(@Part("photo") RequestBody photo, @Part("description") RequestBody description);
使用Retrofit生成该接口的一个实现
使用Builder构建一个Retrofit,并调用Retrofit的create方法创建一个接口实现。构建的时候需要提供baseUrl,而接口定义时使用相对路径即可。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")//这里以/结尾
.addConverterFactory(GsonConverterFactory.create()) //这里使用Gson转换器,需要添加相应依赖
.build();
GitHubService service = retrofit.create(GitHubService.class);
Gson与Converter
- 添加相应依赖:
compile 'com.squareup.retrofit2:converter-gson:2.1.0'
- 在默认情况下Retrofit只支持将Http的响应体转换为ResponseBody
- 但如果响应体只是支持转换为ResponseBody的话何必要引用泛型呢,返回值直接用一个Call就行了
- 既然支持泛型,那说明泛型参数可以是其它类型的,而Converter就是Retrofit为我们提供用于将ResponseBody转换为我们想要的类型
- 当然只改变泛型的类型是不行的,我们在创建Retrofit时需要明确告知用于将ResponseBody转换我们泛型中的类型时需要使用的Converter
自定义Gson对象
如果你需要调整json中的某些格式,例如,日期格式。 你可以通过创建一个Json对象,并将其传递给GsonConverterFactory.create()
Gson gson = new GsonBuilder()
.setDateFormat("yyyy-MM-dd'T'HH:mm:ssZ")
.create();
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.nuuneoi.com/base/")
.addConverterFactory(GsonConverterFactory.create(gson))
.build();
service = retrofit.create(APIService.class);
调用实现的方法来进行同步或异步的HTTP请求
Call<List<Repo>> repos = service.listRepos("octocat");
// 同步请求
List<Repo> repoList = repos.execute().body();
// 异步请求
repos.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
// response.body().string();
}
});
调用接口方法之后返回的是Call对象,可以被异步或同步执行,每个实例只能使用一次,当然可以使用clone()
将会创建一个新的来用。还可以通过cancle方法取消Call
Use an Interceptor
from OkHttp
在Retrofit 1.9你可以使用RequestInterceptor
拦截一个请求,但它已经从Retrofit 2.0中删除,因为HTTP连接层已经移动到OkHttp。
因此,从现在开始,我们必须从OkHttp切换到Interceptor。 首先你必须创建一个带有Interceptor
的OkHttpClient
对象
OkHttpClient client = new OkHttpClient();
client.interceptors().add(new Interceptor() {
@Override
public Response intercept(Chain chain) throws IOException {
Response response = chain.proceed(chain.request());
// Do anything with response here
return response;
}
});
- 并将创建的
client
传递给Retrofit Builder链。
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://api.nuuneoi.com/base/")
.addConverterFactory(GsonConverterFactory.create())
.client(client)
.build();
新的URL解析概念
===========
学习来源
Retrofit
#Android# Retrofit使用指南
Retrofit 2.0: The biggest update yet on the best HTTP Client Library for Android