Retrofit 是如何工作的

How Retrofit works under the hood

关于 Retrofit2 的问题:

构建 Retrofit 实例后,您可以调用接口(客户端)方法之一 "send a request"

例如,如果您有这样的界面:

@POST("webhook.php")
Call<String>  queueCustomer(@Body String queue);

和一个用 create 方法创建的 "client" 的 Retrofit 实例,然后你这样调用它:

client.queueCustomer(someString)

我假设这实际上是在发出网络请求。但是,您获取由此返回的 Call 对象并调用如下内容:

callObject.enqueue(........)

你在调用enqueue时是否在进行后续的网络请求?这是两个网络请求还是第一部分:client.queueCustomer(someString) 只是构建将通过 callObject.enqueue(........) 发送的对象?

提前致谢

当您设置改造实例并使用 Retrofit.create(ApiService::class.java) 创建服务时,然后使用代理 classes 创建服务接口实现。下面是来自 Retrofit class 的代码块,它构造服务接口实现和调用对象。实际上 retrofit 是一个包装器库,用于将接口转换为 OkHttp 调用。因此,当您调用接口方法时,它只是 return 您到相应的调用对象,但除非您 运行 入队或执行方法,否则它不会发出请求。

public <T> T create(final Class<T> service) {
    validateServiceInterface(service);
    return (T) Proxy.newProxyInstance(service.getClassLoader(), new Class<?>[] { service },
        new InvocationHandler() {
          private final Platform platform = Platform.get();
          private final Object[] emptyArgs = new Object[0];

          @Override public @Nullable Object invoke(Object proxy, Method method,
              @Nullable Object[] args) throws Throwable {
            // If the method is a method from Object then defer to normal invocation.
            if (method.getDeclaringClass() == Object.class) {
              return method.invoke(this, args);
            }
            if (platform.isDefaultMethod(method)) {
              return platform.invokeDefaultMethod(method, service, proxy, args);
            }
            return loadServiceMethod(method).invoke(args != null ? args : emptyArgs);
          }
        });
  }