今天是我参加【第四届青训营】笔记创作活动的第8天 使用Java实现Retrofit网络请求,以官网为例,首先需要创建一个普通的Java接口,在接口中定义一个方法,这个方法有自己的定义规则,暂时先不管。
public interface GitHubService{
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
}
使用Ret rofit进行网页请求之前需要有一个请求连接(URL),Retrofit使用方式如下:
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("https://api.github.com/")
.build();
GitHubService service = retrofit.create(GitHubServerice.class);
可以看到在创建Retrofit对象时已经将请求链接的前半部分已经作为baseUrl()方法的参数提供给了retrofit对象,然后再通过retrofit对象的create()方法,将前面自定义的接口类作为参数提供给retrofit对象,而这个retrofit的create()方法的返回值是之前自定义的接口类GitHubService对象。
在Retrofit源码中找到create方法:
// Retrofit
public <T> T create(final Class<T> service) {
return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service }, new InvocationHandler() {
private final Platform platform = Platform.get();
@Override
public Object invoke(Object proxy, Method method, Object... args) {
ServiceMethod serviceMethod = loadServiceMethod(method);
OkHttpCall okHttpCall = new OkHttpCall<>(serviceMethod, args);
return serviceMethod.callAdapter.adapt(okHttpCall);
}
});
}
源码用到了泛型方法create(),通过动态代理利用传入的自定义接口类GitHubService,创建这个接口类对象返回。在动态代理的参数中,需要一个InvocationHandler类的对象,此对象重写的invoke方法中右通过创建的OkHttpCall的对象来实现最终的网络请求,所以可以将Retrofit看作其封装了OKHttp。
在创建成功后我们就可以通过在自定义的接口GitHubService中的方法实现网络的请求,主要通过传入相应的参数调用此方法,实现如下:
Call<List<Repo>> repos = service.listRepos("octocat");
之前的方法定义格式如下:
...
@GET("users/{user}/repos")
Call<List<Repo>> listRepos(@Path("user") String user);
...
注解@GET("user/{user}/repos")代表get请求,最后通过此方法可以得到实际的请求链接为“api.github.com/users/octoc…
通过接口方法返回的参数就可以调用enqueue()方法发起异步请求来获取数据:
repos.enqueue(new Callback<List<Repo>>() {
@Override
public void onResponse(Call<List<Repo>> call, Response<List<Repo>> response) {
//获取成功
}
@Override
public void onFailure(Call<List<Repo>> call, Throwable t) {
//获取失败
}
});
}
标题:Retrofit