Retrofit网络请求 | 青训营笔记

93 阅读1分钟

今天是我参加【第四届青训营】笔记创作活动的第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

网址:square.github.io/retrofit/