ETags help servers and clients check if a resource has changed. This saves time and data by avoiding sending the same data again.
ETag for conditional requests in Rest API
HTTP/1.1 200 OK ETag: "unique-resource-version" {resource data} Client sends: If-None-Match: "unique-resource-version"
The server sends an ETag header with a unique value for the resource version.
The client sends If-None-Match with the ETag value to check if the resource changed.
Server response: HTTP/1.1 200 OK ETag: "abc123" {"name": "Alice"}
Client request: GET /user/1 HTTP/1.1 If-None-Match: "abc123"
Server response if resource unchanged: HTTP/1.1 304 Not Modified
This Flask app returns user data with an ETag header. If the client sends the same ETag, it returns 304 Not Modified.
from flask import Flask, request, jsonify, make_response app = Flask(__name__) # Sample resource data and version resource_data = {"name": "Alice"} resource_etag = 'abc123' @app.route('/user/1') def get_user(): client_etag = request.headers.get('If-None-Match') if client_etag == resource_etag: # Resource not changed return '', 304 # Resource changed or no ETag sent response = make_response(jsonify(resource_data)) response.headers['ETag'] = resource_etag return response if __name__ == '__main__': app.run(debug=True)
ETag values should be unique and change whenever the resource changes.
304 Not Modified responses have no body, saving bandwidth.
ETags help browsers and clients cache data efficiently.
ETags let servers tell clients if data changed.
Clients send ETags back to check freshness.
304 responses avoid sending unchanged data.
Practice
What is the main purpose of an ETag in REST APIs?
Solution
Step 1: Understand ETag role in REST
ETags are unique identifiers for resource versions, used to detect changes.Step 2: Match purpose with options
Only To help clients check if the resource has changed since last fetch describes checking if resource changed, which is the ETag's purpose.Final Answer:
To help clients check if the resource has changed since last fetch -> Option AQuick Check:
ETag purpose = freshness check [OK]
- Confusing ETag with authentication tokens
- Thinking ETag encrypts data
- Assuming ETag sets content type
Which HTTP header should a client send to make a conditional GET request using an ETag?
Solution
Step 1: Identify client header for ETag conditional requests
The client sendsIf-None-Matchheader with the ETag value to check freshness.Step 2: Compare options
If-Modified-Sinceuses dates,ETagis a response header,Cache-Controlcontrols caching rules. OnlyIf-None-Matchfits.Final Answer:
If-None-Match -> Option BQuick Check:
Client uses If-None-Match for ETag check [OK]
- Using ETag header in request instead of response
- Confusing If-Modified-Since with ETag usage
- Sending Cache-Control instead of conditional header
Given this HTTP interaction:GET /resource HTTP/1.1
Host: example.com
If-None-Match: "abc123"
Server responds:HTTP/1.1 304 Not Modified
What does this response mean?
Solution
Step 1: Understand 304 Not Modified status
304 means resource is unchanged since client's ETag, so no new data sent.Step 2: Match meaning with options
The resource has not changed; client should use cached data correctly states client should use cached data because resource is unchanged.Final Answer:
The resource has not changed; client should use cached data -> Option CQuick Check:
304 = Not Modified, use cache [OK]
- Thinking 304 means new data sent
- Confusing 304 with error or unauthorized status
- Ignoring ETag and caching role
Consider this server code snippet handling ETags:
etag = generate_etag(resource)
if request.headers.get('If-None-Match') == etag:
return Response(status=304)
else:
return Response(data=resource, headers={'ETag': etag})
What is a potential bug in this code?
Solution
Step 1: Analyze ETag comparison
ETags in headers often include quotes, so direct string equality may fail if quotes differ.Step 2: Identify mismatch cause
If client sends "abc123" but server etag is abc123 without quotes, comparison fails incorrectly.Final Answer:
It compares ETag strings without quotes, causing mismatch -> Option AQuick Check:
ETag quotes matter in comparison [OK]
- Ignoring quotes around ETag values
- Assuming If-Modified-Since is required for ETag logic
- Returning 304 without checking ETag
You want to optimize your REST API to reduce bandwidth by using ETags. Which approach correctly implements conditional GET requests with ETags?
1. Server generates ETag for resource.
2. Server sends ETag in response header.
3. Client stores ETag.
4. Client sends GET with If-None-Match header.
5. Server compares ETag and returns 304 if unchanged.
6. Otherwise, server sends new data with new ETag.
Which step is missing or incorrect?
Solution
Step 1: Review each step for correctness
Steps 1-4 are correct standard flow for ETag conditional requests.Step 2: Identify subtle issue in step 5
Server must compare ETag values exactly, including quotes, or else conditional check fails.Step 3: Confirm other options are incorrect
Client should store ETag (step 3), If-None-Match is correct header (step 4), and 304 status is correct for unchanged (step 6).Final Answer:
Step 5: Server must compare ETag including quotes exactly -> Option DQuick Check:
Exact ETag match including quotes is required [OK]
- Ignoring quotes in ETag comparison
- Using wrong conditional header
- Sending 200 instead of 304 for unchanged resource
Ready to prove it?
Pass the test and this pattern moves unknown
