Hone logo
Hone
Problems

Implementing API Versioning with Python and Flask

API versioning is a crucial aspect of software development, allowing you to introduce changes to your API without breaking existing clients. This challenge focuses on building a simple API with versioning capabilities using Python and the Flask framework. You'll implement a mechanism to route requests based on a version parameter in the URL, ensuring backward compatibility and a smooth transition for your users.

Problem Description

You are tasked with creating a Flask API that supports multiple versions (v1 and v2). The API should expose a single endpoint, /data, which returns a JSON response. The response content will differ between versions. Versioning will be achieved through a URL parameter named version. The API should gracefully handle requests for unsupported versions and return appropriate error responses.

What needs to be achieved:

  • Create a Flask application.
  • Define a route /data that accepts a version query parameter.
  • Implement logic to return different JSON responses based on the version parameter.
  • Handle requests with invalid or unsupported version values.

Key Requirements:

  • The API must support version=v1 and version=v2.
  • v1 should return {"message": "Data from version 1"}.
  • v2 should return {"message": "Data from version 2", "extra_field": "v2_value"}.
  • If the version parameter is missing or invalid, the API should return a 400 Bad Request error with a helpful message.

Expected Behavior:

  • GET /data?version=v1 should return {"message": "Data from version 1"} and a 200 OK status code.
  • GET /data?version=v2 should return {"message": "Data from version 2", "extra_field": "v2_value"} and a 200 OK status code.
  • GET /data (missing version) should return a 400 Bad Request error with the message "Invalid or missing version parameter."
  • GET /data?version=v3 (invalid version) should return a 400 Bad Request error with the message "Invalid or missing version parameter."

Edge Cases to Consider:

  • Case sensitivity of the version parameter (treat 'V1' as invalid).
  • Empty string for the version parameter.
  • Non-string values for the version parameter (though Flask handles this implicitly by converting to a string).

Examples

Example 1:

Input: GET /data?version=v1
Output: {"message": "Data from version 1"}
Explanation: The API successfully returns the data for version 1.

Example 2:

Input: GET /data?version=v2
Output: {"message": "Data from version 2", "extra_field": "v2_value"}
Explanation: The API successfully returns the data for version 2, including the extra field.

Example 3:

Input: GET /data
Output: 400 Bad Request - {"message": "Invalid or missing version parameter."}
Explanation: The version parameter is missing, resulting in a 400 error.

Constraints

  • The API must be implemented using Flask.
  • The response must be valid JSON.
  • Error responses must have a 400 Bad Request status code.
  • The code should be well-structured and readable.
  • The solution should be concise and efficient.

Notes

  • Consider using Flask's request.args to access the query parameters.
  • You can use abort(400) to return a 400 Bad Request error.
  • Think about how to handle future versions of the API in a scalable way. This solution provides a basic foundation.
  • Focus on the core functionality of versioning; advanced features like authentication or data validation are not required for this challenge.
Loading editor...
python