首页 > 解决方案 > Retrofit:如何获取被调用服务方法的名称?

问题描述

我有一个Interceptor向请求添加所需标头的实现。@Header("foobar")开发人员有时会忘记在服务接口方法中添加所需的注解。在这种情况下,我Interceptor会抛出一个IllegalArgumentException指示丢失的注释。不幸的是,在异常消息中并不清楚调用了哪个服务方法。我想提供被调用的服务方法的名称。有可能吗?

这是我的(kotlin)代码:

    @Throws(IOException::class)
    override fun intercept(chain: Interceptor.Chain): Response {

        val request = chain.request()
        val identifier = request.header(REQUIRED_HEADER) ?: run {
                  val methodName= // how to get the service method name?
                  throw IllegalArgumentException("Missing annotation >@Header(REQUIRED_HEADER)< on service method: $methodName ")

        }

改造它自己可以添加方法名称,以防参数未使用改造注释进行注释。

java.lang.IllegalArgumentException: No Retrofit annotation found. (parameter #1)
    for method HonkAndFlashFalService.startHonkAndFlash
    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:755)
    at retrofit2.ServiceMethod$Builder.methodError(ServiceMethod.java:746)
    at retrofit2.ServiceMethod$Builder.parameterError(ServiceMethod.java:764)

标签: javaandroidretrofitretrofit2

解决方案


经过一番挖掘,我发现retrofit2将一个调用对象注入到原始请求中,应该可以通过以下方式访问:

chain.call().request().tag(retrofit2.Invocation.class))

标签被注入到 RequestFactory.create(Object[] args) 方法中的 retrofit2 中。

请注意,这是使用 retrofit2 2.5.0 完成的,早期版本可能会有所不同


推荐阅读