gpt4 book ai didi

retrofit - 使用 Retrofit 2 模拟不良网络(在实际 API 上,即非模拟 API)

转载 作者:行者123 更新时间:2023-12-02 09:12:33 28 4
gpt4 key购买 nike

在 Retrofit 1.x 中,我使用以下模式创建 API 服务类,该类模拟某些构建变体的不良网络连接。

// Retrofit 1
private <T> T create(Class<T> apiServiceClass) {
T apiService = restAdapter.create(apiServiceClass);
if (!BuildConfig.IS_PRODUCTION_BUILD) {
endpoints = mockRestAdapter.create(apiServiceClass, apiService);
}
return apiService;
}

最酷的事情是使用了我的实际 API 端点。这样我就可以看到应用程序在不稳定连接上的行为,并且不需要提供模拟/人工响应。

现在,在 Retrofit 2 中,API 为 MockRestAdapter或者更确切地说MockRetrofit完全改变了。 MockRetrofit#create现在返回 BehaviorDelegate 。如果我尝试使用与以前相同的模式

// Retrofit 2
private <T> T create(Class<T> apiServiceClass) {
T apiService = retrofit.create(apiServiceClass);
if (!BuildConfig.IS_PRODUCTION_BUILD) {
endpoints = mockRetrofit.create(apiServiceClass).returning(???);
}
return apiService;
}

我被困在returning(???)上。 returning预计 Call<?>执行。但我似乎无法弄清楚如何实现它以使其像我的 Retrofit 1 示例一样工作(也许它不是有意的)。

所以我的问题是:一般来说,如何实现上述 Retrofit 1 模式,以便使用 Retrofit 2 在实际 API 上模拟不良网络?

最佳答案

终于我明白了。这个想法是使用 OkHttp 的应用程序拦截器。这是解决方案。

首先,创建一个NetworkBehavior

final NetworkBehavior behavior = NetworkBehavior.create();
behavior.setDelay(2000, TimeUnit.MILLISECONDS);
behavior.setFailurePercent(50);
behavior.setVariancePercent(50);

当然,您可以向 UI 组件提供行为来动态更改这些值。

配置OkHttpClient时添加以下拦截器。

final OkHttpClient.Builder builder = new OkHttpClient.Builder();
if (!BuildConfig.IS_PRODUCTION_BUILD) {
builder.addInterceptor(new HttpLoggingInterceptor());
builder.addInterceptor(new Interceptor() {
@Override public Response intercept(Chain chain) throws IOException {
try {
Thread.sleep(behavior.calculateDelay(TimeUnit.MILLISECONDS));
} catch (InterruptedException e) {
e.printStackTrace();
}
if (behavior.calculateIsFailure()) {
return new Response.Builder()
.code(500)
.message("MockError")
.protocol(Protocol.HTTP_1_1)
.request(chain.request())
.body(ResponseBody.create(MediaType.parse("text/plain"), "MockError"))
.build();
}
return chain.proceed(chain.request());
}
});
}

请注意,您应该在之前添加一个日志拦截器,以便正确显示请求日志。手动创建的响应对象当然可以根据您的喜好进行调整。有些值是强制性的(例如 protocolrequest)。如果您不指定它们,您将收到 NPE。同样的方法实际上也适用于 Retrofit 1。

关于retrofit - 使用 Retrofit 2 模拟不良网络(在实际 API 上,即非模拟 API),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35701505/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com