改进:如何获取被调用服务方法的名称?

时间:2019-04-02 09:19:25

标签: java android retrofit retrofit2

我有一个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)

1 个答案:

答案 0 :(得分:1)

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

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

标签将被插入到requestFactory.create(Object [] args)方法的retrofit2中。

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