Search code examples
androidjsonencryptionkotlinretrofit2

Call Retrofit2 + Decrypt + Json conversor


I am using retrofit2 in kotlin, and I need to get the content that is a json and this encrypted, I know that to convert json just use the JacksonConverterFactory (until this part was working well) but an encryption was added before that and I do not know how To handle this, do I need to create a converter of my own? Does anyone have a read to tell me?

My current call for retrofit

val retrofit = Retrofit.Builder()                
            .baseUrl("http://100.1.1.100/")
            .addConverterFactory(JacksonConverterFactory.create())
            .client(httpClient.build())
            .build()

And i already have my fucntion (working) to decrypt:

CryptAES.decrypt(value))

Solution

  • This can be done by creating an decrypt interceptor:

    class DecryptInterceptor : Interceptor {
    
        override fun intercept(chain: Interceptor.Chain): Response = chain
                .run { proceed(request()) }
                .let { response ->
                    return@let if (response.isSuccessful) {
                        val body = response.body()!!
    
                        val contentType = body.contentType()
                        val charset = contentType?.charset() ?: Charset.defaultCharset()
                        val buffer = body.source().apply { request(Long.MAX_VALUE) }.buffer()
                        val bodyContent = buffer.clone().readString(charset)
    
                        response.newBuilder()
                                .body(ResponseBody.create(contentType, bodyContent.let(::decryptBody)))
                                .build()
                    } else response
                }
    
        private fun decryptBody(content: String): String {
            //decryption
            return content
        }
    }
    

    setup:

    val httpClient = OkHttpClient().newBuilder()
    httpClient.addInterceptor(DecryptInterceptor())
    val retrofit = Retrofit.Builder()
            .baseUrl("http://100.1.1.100/")
            .addConverterFactory(JacksonConverterFactory.create())
            .client(httpClient.build())
            .build()