如何在深圳开发公司利用淘宝网站搭建虚拟机以支持APP开发?

摘要:淘宝网站如何做虚拟机,深圳开发app的公司,福田欧曼服务站电话,google搜索引擎入口google在上一篇文章中,我们详细分析了 Retrofit 中的注解解析和动态代理实现,本
淘宝网站如何做虚拟机,深圳开发app的公司,福田欧曼服务站电话,google搜索引擎入口google在上一篇文章中#xff0c;我们详细分析了 Retrofit 中的注解解析和动态代理实现#xff0c;本篇文章将继续深入研究 Retrofit 的核心源码#xff0c;重点分析 Retrofit 如何进行网络请求和响应处理。 网络请求 在使用 Retrofit 发起网络请求时#xff0c;我们可以通过定…在上一篇文章中我们详细分析了 Retrofit 中的注解解析和动态代理实现本篇文章将继续深入研究 Retrofit 的核心源码重点分析 Retrofit 如何进行网络请求和响应处理。 网络请求 在使用 Retrofit 发起网络请求时我们可以通过定义一个接口并使用 Retrofit 的注解来描述这个接口中的请求Retrofit 会自动生成一个实现该接口的代理对象。当我们调用这个代理对象的方法时Retrofit 会根据注解的描述构建一个 Request 对象并使用 OkHttp 将这个 Request 发送出去。 在 Retrofit 中我们可以通过 Retrofit#execute 或 Retrofit#enqueue 方法来发送请求。这两个方法的区别在于execute 方法会阻塞当前线程直到请求完成而 enqueue 方法会将请求加入到 OkHttp 的请求队列中并在请求完成时通过回调通知我们。 我们先来看一下 execute 方法的实现 public T T execute(CallT call) throws IOException {Utils.validateServiceInterface(call.request().tag(), call.request().url().toString());return (T) callAdapter(call, call.request().tag()).adapt(call).execute(); } 在这个方法中首先会对接口进行校验确保这个接口是有效的。然后我们会根据请求的 Tag 和 URL 来获取适配器callAdapter并使用适配器来执行请求。 适配器的作用是将请求的参数适配成 OkHttp 能够识别的形式并将 OkHttp 的响应适配成我们需要的形式。Retrofit 提供了一系列的适配器包括 Call 适配器、RxJava 适配器、CompletableFuture 适配器等。 我们来看一下 callAdapter 方法的实现 private CallAdapter?, ? callAdapter(Call? call, Object tag) {Type responseType call.request().method().equals(HEAD)? Void.class: getParameterUpperBound(0, (ParameterizedType) call.request().tag());return callAdapter(tag, responseType); }在这个方法中我们首先根据请求的方法来判断响应的类型如果是 HEAD 方法那么响应的类型就是 Void否则我们会通过反射来获取请求的响应类型并使用这个响应类型来获取适配器。 获取适配器的方法是 callAdapter public R, T CallAdapterR, T callAdapter(Object tag, Type returnType) {// ...for (CallAdapter.Factory factory : adapterFactories) {CallAdapter?, ? adapter factory.get(returnType, annotations, this);if (adapter ! null) {return (CallAdapterR, T) adapter;}}// ... }在这个方法中我们会遍历所有的适配器工厂尝试获取适配器。在获取适配器时我们会将请求的响应类型、注解和 Retrofit 实例作为参数传入。每个适配器工厂都会判断这些参数是否符合自己的适配条件如果符合就返回一个适配器实例否则返回 null。在遍历完所有的适配器工厂之后如果还没有获取到适配器那么就会抛出一个异常。 获取到适配器之后我们就可以使用适配器来执行请求了。在适配器中我们会将请求参数转换成 OkHttp 的 Request 对象并将 OkHttp 的 Response 对象转换成我们需要的响应类型。具体的实现可以参考 Retrofit 提供的 CallAdapter 接口。 对于 enqueue 方法我们可以先来看一下 enqueue 方法的实现 public T void enqueue(CallT call, CallbackT callback) {Utils.validateServiceInterface(call.request().tag(), call.request().url().toString());callAdapter(call, call.request().tag()).adapt(call).enqueue(new CallbackRunnable(callback)); }在这个方法中我们首先进行接口校验然后根据请求的 Tag 和 URL 来获取适配器并使用适配器来执行请求。不同的是在 enqueue 方法中我们将一个 Callback 对象作为参数传入适配器的 enqueue 方法中以便在请求完成后回调通知我们。 在适配器中我们可以看到 enqueue 方法的实现 public void enqueue(final CallbackT callback) {delegate.enqueue(new CallbackResponseT() {Override public void onResponse(CallResponseT call, ResponseResponseT response) {ResponseT body;try {body response.body();} catch (Throwable t) {if (response.code() 204) {body null;} else {callback.onFailure(call, t);return;}}if (response.isSuccessful()) {callback.onResponse(call, Response.success(body, response.raw()));} else {callback.onFailure(call, Response.error(response.errorBody(), response.raw()));}}Override public void onFailure(CallResponseT call, Throwable t) {callback.onFailure(call, t);}}); }在这个方法中我们会将传入的 Callback 对象转换成一个 CallbackResponseT 对象并使用这个对象来调用 OkHttp 的 enqueue 方法。在请求完成后我们会将 OkHttp 的 Response 对象转换成 Retrofit 的 Response 对象并根据响应码来判断请求的结果。如果响应码表示请求成功那么我们就调用 Callback 对象的 onResponse 方法否则就调用 Callback 对象的 onFailure 方法。 响应处理 在 Retrofit 中我们可以通过定义一个接口并使用注解来描述我们期望的请求格式和响应格式。例如我们可以通过 GET 注解来描述一个 GET 请求使用 Query 注解来描述请求参数使用 Body 注解来描述请求体使用 Headers 注解来描述请求头等。 在执行请求时Retrofit 会根据这些注解来自动生成一个对应的请求对象并将请求对象转换成 OkHttp 的 Request 对象。在接收响应时Retrofit 会将 OkHttp 的 Response 对象转换成一个对应的响应对象并将响应对象中的数据转换成我们需要的数据类型。这些转换工作是通过 Retrofit 的转换器来完成的Retrofit 中默认提供了两个转换器GsonConverterFactory 和 JacksonConverterFactory。我们也可以自定义一个转换器来实现我们期望的数据转换。 在 Retrofit 类的构造方法中我们可以看到 Retrofit 默认使用了 Platform.get() 方法来获取当前运行平台的默认转换器工厂并将其添加到 converterFactories 中。然后我们可以使用 addConverterFactory 方法来添加自定义的转换器工厂。 public Retrofit(Builder builder) {// ...if (builder.converterFactories null) {converterFactories.add(Platform.get().defaultConverterFactory());} else {converterFactories.addAll(builder.converterFactories);}// ... }public interface Platform {// ...Converter.Factory defaultConverterFactory(); }在execute方法中我们会调用适配器的 adapt 方法来执行请求并将返回的 Call 对象转换成一个响应对象。在转换过程中我们会根据响应类型来选择对应的转换器来进行转换。具体的转换实现可以参考 Retrofit 提供的 Converter 接口和 Converter.Factory 接口。 public T T execute(CallT call) throws IOException {// ...ResponseT response call.execute();if (response.isSuccessful()) {return response.body();} else {ConverterResponseBody, ErrorResponse converter retrofit.responseBodyConverter(ErrorResponse.class, new Annotation[0]);throw new ApiException(converter.convert(response.errorBody()));} }SuppressWarnings(unchecked) // Single-interface proxy creation guarded by parameter safety. public T T adapt(CallT call) {return (T) new OkHttpCall(requestFactory, callFactory, converter, call); }public T ConverterResponseBody, T responseBodyConverter(Type type, Annotation[] annotations) {return nextResponseBodyConverter(null, type, annotations); }public T ConverterResponseBody, T nextResponseBodyConverter(Nullable Converter.Factory skipPast, Type type, Annotation[] annotations) {Objects.requireNonNull(type, type null);Objects.requireNonNull(annotations, annotations null);int start converterFactories.indexOf(skipPast) 1;for (int i start, count converterFactories.size(); i count; i) {ConverterResponseBody, ? converter converterFactories.get(i).responseBodyConverter(type, annotations, this);if (converter ! null) {return (ConverterResponseBody, T) converter;}}throw new IllegalArgumentException(Could not locate ResponseBody converter for type with annotations Arrays.toString(annotations)); }以上是 Retrofit 中处理响应的核心代码。当我们执行一个请求时Retrofit 会先将请求转换成 OkHttp 的 Request 对象并发送出去然后等待响应返回。当响应返回时Retrofit 会将响应转换成一个响应对象并将响应对象中的数据转换成我们期望的数据类型。这个过程中我们可以使用 Retrofit 提供的转换器来自定义数据的转换规则。 下面是一个示例演示了如何使用 Retrofit 来发送一个 GET 请求并将响应中的 JSON 数据转换成一个 Java 对象 public interface ApiService {GET(users/{user}/repos)CallListRepo listRepos(Path(user) String user); }Retrofit retrofit new Retrofit.Builder().baseUrl(https://api.github.com/).addConverterFactory(GsonConverterFactory.create()).build();ApiService apiService retrofit.create(ApiService.class); CallListRepo call apiService.listRepos(smallmarker); ListRepo repos call.execute().body();在上面的示例中我们首先使用 Retrofit 构建器创建一个 Retrofit 实例并指定了请求的基础 URL 和转换器工厂。然后我们通过调用 create 方法来创建一个 ApiService 的代理对象。最后我们调用 listRepos 方法来发送一个 GET 请求。 在上面的示例中我们使用了 Retrofit 的 GsonConverterFactory 来将响应体中的 JSON 数据转换成 Java 对象。具体实现可以查看 Retrofit 提供的 GsonConverterFactory 类。 public final class GsonConverterFactory extends Converter.Factory {private final Gson gson;private GsonConverterFactory(Gson gson) {this.gson gson;}public static GsonConverterFactory create() {return create(new Gson());}public static GsonConverterFactory create(Gson gson) {if (gson null) throw new NullPointerException(gson null);return new GsonConverterFactory(gson);}Overridepublic Nullable ConverterResponseBody, ? responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {TypeAdapter? adapter gson.getAdapter(TypeToken.get(type));return new GsonResponseBodyConverter(gson, adapter);}Overridepublic Nullable Converter?, RequestBody requestBodyConverter(Type type, Annotation[] parameterAnnotations,Annotation[] methodAnnotations, Retrofit retrofit) {TypeAdapter? adapter gson.getAdapter(TypeToken.get(type));return new GsonRequestBodyConverter(gson, adapter);} }可以看到GsonConverterFactory 继承了 Retrofit 的 Converter.Factory 类并重写了其中的 responseBodyConverter 方法和 requestBodyConverter 方法。在 responseBodyConverter 方法中我们将响应体中的 JSON 数据转换成 Java 对象而在 requestBodyConverter 方法中我们将 Java 对象转换成请求体中的 JSON 数据。 除了 GsonConverterFactory 以外Retrofit 还提供了其他的转换器如 JacksonConverterFactory、MoshiConverterFactory 等我们可以根据需要选择适合自己的转换器。 总的来说Retrofit 中网络请求和响应处理的核心代码非常简洁明了。我们只需要通过定义接口来描述请求和响应然后使用 Retrofit 的动态代理机制来将接口转换成一个实际的实现类并通过 Retrofit 的配置来指定请求和响应的转换器即可。这种方式大大简化了网络请求的流程使得我们可以更加专注于业务逻辑的处理。