An OkHttp interceptor is a component that can observe, modify, and retry HTTP requests and responses in an OkHttp client.
Click to reveal answer
beginner
Name the two main types of OkHttp interceptors.
The two main types are Application Interceptors and Network Interceptors. Application interceptors work before the request is sent and after the response is received. Network interceptors work at the network level, just before the request is sent to the network and just after the response is received from the network.
Click to reveal answer
beginner
How do you add an interceptor to an OkHttpClient in Kotlin?
You add an interceptor by calling addInterceptor() or addNetworkInterceptor() on the OkHttpClient.Builder before building the client.
Click to reveal answer
beginner
What is a common use case for an OkHttp interceptor?
Common uses include adding headers like authentication tokens, logging request and response data, retrying requests, and modifying requests or responses.
Click to reveal answer
intermediate
What is the difference between proceed(request) and modifying the request inside an interceptor?
proceed(request) sends the request to the next interceptor or network. You can modify the request before calling proceed() to change headers or body.
Click to reveal answer
Which method do you override to create a custom OkHttp interceptor?
Aintercept(chain: Interceptor.Chain)
BonRequest()
ChandleRequest()
Dexecute()
✗ Incorrect
You override the intercept(chain: Interceptor.Chain) method to define how the interceptor processes requests and responses.
Where does a network interceptor operate in the request lifecycle?
AOnly on cached responses
BBefore the request is sent to the network
CAfter the response is received from the network
DOnly on failed requests
✗ Incorrect
Network interceptors operate just before the request is sent to the network and can also observe the raw response.
Which OkHttpClient builder method adds an application interceptor?
AaddInterceptor()
BaddNetworkInterceptor()
CsetInterceptor()
DuseInterceptor()
✗ Incorrect
addInterceptor() adds an application interceptor that works on all requests and responses.
What happens if you don’t call proceed(request) inside an interceptor?
AThe request is retried
BThe request is sent anyway
CThe interceptor throws an exception automatically
DThe request chain stops and no network call is made
✗ Incorrect
Not calling proceed(request) stops the chain, so the request does not continue to the next interceptor or network.
Which of these is NOT a typical use of an OkHttp interceptor?
AAdding authentication headers
BLogging request and response data
CChanging the app theme colors
DRetrying failed requests
✗ Incorrect
Changing app theme colors is unrelated to network requests and not done by interceptors.
Explain how OkHttp interceptors can help add authentication tokens to every request.
Think about how you can change the request before it goes out.
You got /3 concepts.
Describe the difference between application interceptors and network interceptors in OkHttp.
Consider when each interceptor sees the request and response.
You got /3 concepts.
Practice
(1/5)
1. What is the main purpose of an OkHttp interceptor in Android Kotlin?
easy
A. To manage database transactions
B. To observe and modify network requests and responses
C. To create UI components dynamically
D. To handle user input events
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 B
Quick Check:
Interceptor purpose = Observe and modify network calls [OK]
Hint: Interceptors always deal with network requests/responses [OK]
Common Mistakes:
Confusing interceptors with UI or database components
Thinking interceptors handle user input
Assuming interceptors manage app navigation
2. Which of the following is the correct way to implement an OkHttp interceptor in Kotlin?
easy
A. fun intercept(chain: Chain): Response {
return chain.proceed(chain.request())
}
B. class MyInterceptor : Runnable {
override fun run() {
// code
}
}
C. class MyInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
return chain.proceed(chain.request())
}
}
D. class MyInterceptor {
fun intercept(chain: Interceptor.Chain) {
// code
}
}
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 C
Quick Check:
Interceptor class implements Interceptor interface [OK]
Hint: Interceptor must override intercept(chain: Interceptor.Chain): Response [OK]
Common Mistakes:
Not implementing Interceptor interface
Wrong method signature or missing return type
Using unrelated interfaces like Runnable
3. Given this interceptor code snippet, what will be the value of the "User-Agent" header in the outgoing request?
class UserAgentInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response {
val newRequest = chain.request().newBuilder()
.header("User-Agent", "MyAppAgent")
.build()
return chain.proceed(newRequest)
}
}
medium
A. The request will have "User-Agent" header set to "MyAppAgent"
B. The request will have no "User-Agent" header
C. The request will have "User-Agent" header set to the default OkHttp value
D. The code will cause a compile error
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 A
4. Identify the error in this interceptor code snippet:
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}")
}
medium
A. Missing return statement for the Response object
B. Incorrect method name; should be interceptRequest
C. Cannot use println inside intercept method
D. Request object is not created properly
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 A
Quick Check:
intercept() must return Response [OK]
Hint: Always return the Response from intercept() [OK]
Common Mistakes:
Forgetting to return the response
Renaming intercept method incorrectly
Thinking println is disallowed in intercept
5. You want to create an OkHttp interceptor that retries a request up to 3 times if the response code is 500 (server error). Which approach correctly implements this behavior?
hard
A. Use a separate thread to retry the request after intercept() returns
B. Throw an exception inside intercept() when response code is 500 to trigger retry
C. Modify the request headers to include "Retry: 3" and proceed once
D. Override intercept() to loop up to 3 times calling chain.proceed(request) until response.code != 500 or max retries reached
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 D
Quick Check:
Retry logic = loop in intercept() calling chain.proceed() [OK]
Hint: Retries must be done inside intercept() by repeating chain.proceed() [OK]
Common Mistakes:
Trying to retry outside intercept() method
Assuming headers control retry automatically
Throwing exceptions to trigger retry without handling
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.