firebase - 如何在 RxJava 2 自定义运算符的 onSubscribe 上获取 RetroFit 请求的 URL 和方法?

标签 firebase kotlin retrofit2 rx-java2 firebase-performance

所以我正在尝试为 Http 请求集成 Firebase 性能并在它们显示时手动添加它们 here (第 9 步)。

我正在使用 Retrofit 2 和 RxJava 2,所以我有了做一个自定义运算符的想法,检查下面的代码:

改造 2 客户端

@GET("branch-{environment}/v2/branches")
    fun getBranch(@Path("environment") environment: String, @Query("location") location: String, @Query("fulfilment_type") fulfilmentType: String): Single<Response<GetBranchResponse>>

RxJava 调用 Retrofit 客户端

private val client: BranchClient = clientFactory.create(urlProvider.apiUrl)

override fun getBranch(postCode: String, fulfilmentType: FulfilmentType): Single<GetBranchResponse> {
        return client
                .getBranch(environment, postCode.toUpperCase(), fulfilmentType.toString())
                .lift(RxHttpPerformanceSingleOperator(URL?, METHOD?))
                .map { it.body() }
                .subscribeIO() //custom Kotlin extension 
                .observeMain() //custom Kotlin extension 
                ...
    } 

通过 lift 的 RxJava 2 自定义运算符:

class RxHttpPerformanceSingleOperator<T>(private val url: String, private val method: String) : SingleOperator<Response<T>, Response<T>> {


    private lateinit var metric: HttpMetric

    @Throws(Exception::class)
    override fun apply(observer: SingleObserver<in Response<T>>): SingleObserver<in Response<T>> {
        return object : SingleObserver<Response<T>> {

            override fun onSubscribe(d: Disposable) {

                    metric = FirebasePerformance.getInstance().newHttpMetric(url,
                            method.toUpperCase())
                    metric.start()


                observer.onSubscribe(d)
            }

            override fun onSuccess(t: Response<T>) {
                observer.onSuccess(t)

                //More info: https://firebase.google.com/docs/perf-mon/get-started-android
                metric.setRequestPayloadSize(t.raw().body().contentLength())
                metric.setHttpResponseCode(t.code())
                metric.stop()
            }

            override fun onError(e: Throwable) {
                observer.onError(e)
                metric.stop()
            }


        }
    }

所以目前我不确定如何以正确的方式获取请求的 URL 和方法(标记为 URL?和 METHOD?)发送给运算符(operator)强>,

我需要他们在 onSubscribe 上启动指标..但我没有得到回应......


目前 UGLYYYYYYYY 我的方法是:

添加到改造客户端:

@GET("branch-{environment}/v2/branches")
    fun getBranchURL(@Path("environment") environment: String, @Query("location") location: String, @Query("fulfilment_type") fulfilmentType: String): Call<JsonObject>

添加参数为:

val request = client.getBranchURL(environment, postCode.toUpperCase(), fulfilmentType.toString()).request()

url = request.url().toString()
method = request.method()

这让我在客户端上为每个请求都有 2 个条目......这没有意义。


一些有用的线索: - How to get the request url in retrofit 2.0 with rxjava?

最佳答案

使用 FirebaseInstance 将 Retrofit Interceptor 添加到您的 HttpClient.Builder 并在那里生成您的 HttpMetrics:

class FirebasePerformanceInterceptor(val performanceInstance: FirebasePerformance) : Interceptor {
    override fun intercept(chain: Interceptor.Chain): Response {
        val request = chain.request()
        //Get request values
        val url = request.url().url()
        val requestPayloadSize = request.body()?.contentLength() ?: 0L
        val httpMethod = request.method()

        //Initialize http trace
        val trace = performanceInstance.newHttpMetric(url, httpMethod)
        trace.setRequestPayloadSize(requestPayloadSize)
        trace.start()

        //Proceed
        val response = chain.proceed(chain.request())

        //Get response values
        val responseCode = response.code()
        val responsePayloadSize = response.body()?.contentLength() ?: 0L

        //Add response values to trace and close it
        trace.setHttpResponseCode(responseCode)
        trace.setResponsePayloadSize(responsePayloadSize)
        trace.stop()

        return response
    }
}

你可以直接复制粘贴这段代码,就可以了。 享受吧!

关于firebase - 如何在 RxJava 2 自定义运算符的 onSubscribe 上获取 RetroFit 请求的 URL 和方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48332073/

相关文章:

java - [CustomClassMapper] : No setter/field for . .. 在 Firebase Firestore 中的类中找到

android - 使用 Retrofit2 调用 API 来保存和检索 JWT Token

java - com.google.gson.JsonIOException : JSON document was not fully consumed in Android Retrofit

firebase - 如何为 Firebase 事件参数重用 Google Analytics

firebase - 如何从 Flutter 退出 Google Auth?

python - 有没有办法在 python 中监听 firebase 数据库的变化?

kotlin - 循环遍历 Kotlin x 次,但不使用索引

kotlin - 有什么方法可以要求在 kotlin 中的类型参数上添加注释吗?

pattern-matching - Kotlin when() 局部变量介绍

java - Glide 不从 url 加载图像