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

所以我正在尝试为Http请求集成Firebase性能,并像这里显示的那样手动添加它们(步骤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> 

RxJava呼叫改造客户端

 private val client: BranchClient = clientFactory.create(urlProvider.apiUrl) override fun getBranch(postCode: String, fulfilmentType: FulfilmentType): Single { return client .getBranch(environment, postCode.toUpperCase(), fulfilmentType.toString()) .lift(RxHttpPerformanceSingleOperator(URL?, METHOD?)) .map { it.body() } .subscribeIO() //custom Kotlin extension .observeMain() //custom Kotlin extension ... } 

RxJava 2自定义操作员通过电梯:

 class RxHttpPerformanceSingleOperator(private val url: String, private val method: String) : SingleOperator<Response, Response> { private lateinit var metric: HttpMetric @Throws(Exception::class) override fun apply(observer: SingleObserver<in Response>): SingleObserver<in Response> { return object : SingleObserver<Response> { override fun onSubscribe(d: Disposable) { metric = FirebasePerformance.getInstance().newHttpMetric(url, method.toUpperCase()) metric.start() observer.onSubscribe(d) } override fun onSuccess(t: Response) { 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和METHOD (标记为URL?和METHOD?) 发送给运营商

我需要他们onSubscribe开始度量 ..在那里,我没有与它的回应…


目前我的做法是:

添加到改造客户端:

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

添加添加参数为:

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

这使得我在每个请求的客户端上有两个条目……这是没有意义的。


一些有用的线索: – 如何使用rxjava在2.0版本中获取请求的URL?

我要建议的不一定是你的方法,它只是一种思考你想要完​​成的事情的不同方式。

我会建议2种不同的方法:

  • 创建你自己的observer(创建一个扩展Observer的类),它接收一个Retrofit Call对象,并在subscribeActual方法中执行你的firebase逻辑。
  • 使用Aspectj来定义一个注释,这个注释在Retrofit调用即将被执行时将被处理,并且你可以在Aspect中执行firebase逻辑。 (我不确定Aspectj和Kotlin是如何工作的)