Android:使用 Retrofit 和 OkHttp 模拟响应

1 篇文章 0 订阅
1 篇文章 0 订阅

什么是模拟服务器?

模拟 API 服务器或模拟服务器 API 通过向请求提供逼真的模拟 API 响应来模仿真实的 API 服务器。它们可以在您的本地计算机或公共 Internet 上。响应可以是静态的或动态的,并模拟真实 API 将返回的数据,将模式与数据类型、对象和数组相匹配。

为什么 API 模拟?

当实时数据不可用或不可靠时,模拟 API 服务器在开发和测试期间很有用。在设计 API 时,您可以使用模拟 API 在前端和后端同时工作,以及收集开发人员的反馈。

您还可以使用模拟 API 来模拟您无法控制的 API。例如,当您未连接到 Internet 时,您可以使用本地模拟服务器来伪造来自公共 API 的结果。或者,如果对 API 的实时调用会产生提供商的费用,则使用模拟数据响应。

如何使用 OkHttp 模拟 API 响应并使用 Retrofit 进行消费?

我们可以简单地在 的帮助下实现模拟 API 响应,OkHttp以及如何实现?通过使用Interceptorfrom OkHttp。提供了一种在客户端(Android 应用程序)OkHttp请求的每个网络操作期间进行拦截的方法。

实际例子?

比方说,我们要调用一个名为 的 api 端点fake-login。此 API 端点应返回响应(错误或成功)。但此时,我们刚刚收到JSON后端工程团队的回复, APIs仍在开发中。

在这种情况下,我们可以从中受益OkHttp。我们可以在网络操作期间拦截并要求OkHttp返回一个/一些 API 端点的模拟响应。

让我们进入编码部分😁

object APIProvider {
    //Return a lazy instance of OkHttp client
    private val myHttpClient: OkHttpClient by lazy {
        val ins = OkHttpClient().newBuilder()
            .connectTimeout(1, TimeUnit.MINUTES)
            .readTimeout(1, TimeUnit.MINUTES)
            .writeTimeout(1, TimeUnit.MINUTES)
            .retryOnConnectionFailure(true)
        ins.build()
    }

    //Public access point for Mock API Service
    fun getMockAPI(): MockAPIEndpoint = retrofitInstance.create(MockAPIEndpoint::class.java)

    //Return a lazy Retrofit instance
    private val retrofitInstance: Retrofit by lazy {
        Retrofit.Builder()
            .baseUrl("https://rommansabbir/api/v2/")
            .client(myHttpClient)
            .build()
    }
}

我们有一个Singleton Object被调用的APIProvider,它公开一个公共函数来访问MockAPIEndpoint. 让我们来看看MockAPIEndpoint。

interface MockAPIEndpoint {
    @GET("fake-login")
    fun login(): Call<ResponseBody>
}

MockAPIEndpoint目前只有一个 API,我们希望将模拟JSON对象返回为Response.

现在,让我们学习我们的LoginInterceptor课程。

class LoginInterceptor: Interceptor{
    override fun intercept(chain: Interceptor.Chain): Response {
        //If requested endpoint matched to targeted endpoint, we will return an mocked response.
        if (chain.request().url.toUri().toString().endsWith("fake-login")) {
            val responseString = "OUR_JSON_RESPONSE_FROM_ASSET_OR_OTHER_SOURCE"
            return chain.proceed(chain.request())
                .newBuilder()
                .code(200)
                .protocol(Protocol.HTTP_2)
                .message(responseString)
                .body(
                    responseString
                        .toByteArray()
                        .toResponseBody(
                            "application/json".toMediaTypeOrNull()
                        )
                )
                .addHeader("content-type", "application/json")
                .build()
        } else {
            //Skip the interception.
            return chain.proceed(chain.request())
        }
    }
}

在这里,我们在 API 请求期间进行拦截。如果请求的端点与我们的目标端点匹配,我们将返回一个模拟JSON对象作为响应。我们可以JSON从Asset或其他来源(例如String)获得此信息。

我们几乎完成了 API 模拟。让我们添加LoginInterceptor到OkHttpClient. 如下图所示更新APIProvider::myHttpClient。

  //Return a lazy instance of OkHttp client
    private val myHttpClient: OkHttpClient by lazy {
        val ins = OkHttpClient().newBuilder()
            .connectTimeout(1, TimeUnit.MINUTES)
            .readTimeout(1, TimeUnit.MINUTES)
            .writeTimeout(1, TimeUnit.MINUTES)
            .retryOnConnectionFailure(true)
        //Adding our LoginInterceptor only on Debug mode only
        if (BuildConfig.DEBUG){
            ins.addInterceptor(LoginInterceptor())
        }
        ins.build()
    }

现在,当我们想要使用 对目标端点执行 API 请求时Retrofit,OkHttp将返回 Mock API 响应。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值