如何获取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是如何工作的)
- 使用RxJava加入来自Firebase实时数据库的扁平化数据
- 使用Kotlin和Firebase通过onAuthStateChanged回调触发sendEmailVerification
- 为什么这个ChildEventListener不从Firebase节点读取数据?
- 如何从Firebase数据库检索数据并将其存储在ListArray <Class>中? – Kotlin
- 有没有办法将后端(Kotlin)服务器应用程序部署到Firebase?
- 如何获取在Firestore数据库中的Android文档ID或名称传递到另一个活动?
- 如何使用Firebase服务器时间戳生成日期?
- 如何更改Kotlin属性的名称以匹配Firebase数据库上的字段
- 使用Firebase查询实施Firebase原生快递广告