Supongamos que tenemos que enviar en todas las llamadas a web services, un valor o un token o cualquier cosa.
Lo que podemos hacer con retrofit es un interceptor, este lo declaramos una vez y para todas las llamadas enviarán los valores. Veamos un ejemplo:
@Component
class RetrofitClient {
@Value("\${service.url}")
private lateinit var baseUrl: String
private lateinit var retrofit: Retrofit
private lateinit var objectMapper: ObjectMapper
@PostConstruct
fun init() {
objectMapper = ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.registerModule(KotlinModule())
val client = OkHttpClient.Builder().addInterceptor(EjemploInterceptor()).build()
retrofit = Retrofit.Builder()
.baseUrl(baseUrl)
.client(client)
.addConverterFactory(JacksonConverterFactory.create(objectMapper))
.build()
}
fun <T> buildService(service: Class<T>): T {
return retrofit.create(service)
}
}
class EjemploInterceptor : Interceptor {
companion object {
private const val EJEMPLO = "ejemplo"
}
override fun intercept(chain: Interceptor.Chain): Response = chain.run {
proceed(
request()
.newBuilder()
.addHeader(EJEMPLO, "valor a agregar")
.build()
)
}
}
En este ejemplo en todas las llamadas enviarán el valor agregado en el head. Y listo!