OkHttp interceptors let you watch and change network requests and responses. They help you add headers, log data, or handle errors easily.
OkHttp interceptors in Android Kotlin
class MyInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() // Modify request if needed val response = chain.proceed(request) // Modify response if needed return response } } val client = OkHttpClient.Builder() .addInterceptor(MyInterceptor()) .build()
The intercept function runs for every request.
Use chain.proceed(request) to continue the request and get the response.
class HeaderInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val newRequest = chain.request().newBuilder() .addHeader("Authorization", "Bearer mytoken") .build() return chain.proceed(newRequest) } }
class LoggingInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() println("Sending request to ${request.url}") val response = chain.proceed(request) println("Received response with code ${response.code}") return response } }
This program creates an OkHttp client with a logging interceptor. It sends a GET request to https://httpbin.org/get. The interceptor prints the request URL and response code. Finally, it prints the length of the response body.
import okhttp3.Interceptor import okhttp3.OkHttpClient import okhttp3.Request import okhttp3.Response class SimpleLoggingInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { val request = chain.request() println("Request URL: ${request.url}") val response = chain.proceed(request) println("Response code: ${response.code}") return response } } fun main() { val client = OkHttpClient.Builder() .addInterceptor(SimpleLoggingInterceptor()) .build() val request = Request.Builder() .url("https://httpbin.org/get") .build() val response = client.newCall(request).execute() println("Response body length: ${response.body?.string()?.length}") }
Interceptors run on a background thread, so avoid UI work inside them.
Use application interceptors for general tasks like adding headers.
Use network interceptors if you need to work with data after caching or retries.
OkHttp interceptors let you watch and change network requests and responses.
They are useful for adding headers, logging, retrying, or modifying data.
Create an interceptor by implementing the Interceptor interface and overriding intercept().
Practice
Solution
Step 1: Understand the role of interceptors
OkHttp interceptors allow you to watch and change network requests and responses before they are sent or after they are received.Step 2: Compare with other options
The other options relate to managing database transactions, creating UI components dynamically, and handling user input events, which are unrelated to network interception.Final Answer:
To observe and modify network requests and responses -> Option BQuick Check:
Interceptor purpose = Observe and modify network calls [OK]
- Confusing interceptors with UI or database components
- Thinking interceptors handle user input
- Assuming interceptors manage app navigation
Solution
Step 1: Check the interface implementation
OkHttp interceptors implement the Interceptor interface and override the intercept() method with the correct signature.Step 2: Validate method signature and return type
The intercept method must take Interceptor.Chain and return a Response object, as shown in class MyInterceptor : Interceptor { override fun intercept(chain: Interceptor.Chain): Response { return chain.proceed(chain.request()) } }.Final Answer:
Correct interceptor implementation with override and proper method signature -> Option CQuick Check:
Interceptor class implements Interceptor interface [OK]
- Not implementing Interceptor interface
- Wrong method signature or missing return type
- Using unrelated interfaces like Runnable
class UserAgentInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = chain.request().newBuilder()
.header("User-Agent", "MyAppAgent")
.build()
return chain.proceed(newRequest)
}
}Solution
Step 1: Analyze header modification
The interceptor creates a new request builder from the original request and sets the "User-Agent" header explicitly to "MyAppAgent".Step 2: Understand header effect
Setting the header with .header() replaces any existing "User-Agent" header with the new value.Final Answer:
"User-Agent" header is set to "MyAppAgent" in the outgoing request -> Option AQuick Check:
Header set by interceptor = "MyAppAgent" [OK]
- Assuming header is appended instead of replaced
- Thinking default headers remain unchanged
- Confusing compile errors with runtime behavior
class LoggingInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request()
println("Request URL: ${request.url}")
val response = chain.proceed(request)
println("Response code: ${response.code}")
}Solution
Step 1: Check method return type
The intercept method must return a Response object, but this code does not return anything.Step 2: Verify other code parts
Method name and usage of println are valid; request creation is correct.Final Answer:
Missing return statement for the Response object -> Option AQuick Check:
intercept() must return Response [OK]
- Forgetting to return the response
- Renaming intercept method incorrectly
- Thinking println is disallowed in intercept
Solution
Step 1: Understand retry logic in intercept()
Retries must happen inside intercept() by calling chain.proceed(request) multiple times if needed.Step 2: Evaluate options for retry implementation
Override intercept() to loop up to 3 times calling chain.proceed(request) until response.code != 500 or max retries reached correctly loops and retries up to 3 times checking response code. The other options do not implement retry correctly or rely on unsupported mechanisms.Final Answer:
Loop inside intercept() to retry request up to 3 times on 500 response -> Option DQuick Check:
Retry logic = loop in intercept() calling chain.proceed() [OK]
- Trying to retry outside intercept() method
- Assuming headers control retry automatically
- Throwing exceptions to trigger retry without handling
Ready to prove it?
Pass the test and this pattern moves unknown
