0%

Met een API communiceren · oefening

Valideer de itemspagina

Geslaagd JSON decoderen bewijst syntaxis, geen betekenis. Voeg validate_items_page(document) toe en wijs gegevens buiten het gecontroleerde paginacontract af met ValueError.

Het object op het hoogste niveau heeft precies deze sleutels:

items, page, page_size, total, has_next, next_page

items is een lijst. Elk item is een dictionary met precies id, name, category en value. Id’s en waarden zijn gehele getallen; bool mag niet als geheel getal doorgaan. Namen en categorieën zijn niet-lege tekst. Het paginanummer is een geheel getal van 1 tot en met 10, de paginagrootte een geheel getal van 1 tot en met 3 en het totaal een niet-negatief geheel getal.

De paginavelden moeten één mogelijk deel van de dataset beschrijven. Dat deel begint bij (page - 1) * page_size. Een geslaagde pagina van een niet-lege dataset begint vóór total en het aantal items is het kleinste van page_size en het aantal overgebleven items. has_next geeft precies aan of na deze pagina nog items overblijven. Als die waar is, is next_page gelijk aan page + 1; anders is next_page gelijk aan None. Bij een lege dataset bevat pagina 1 geen items en is er geen volgende pagina.

Bouw het document niet opnieuw op en sorteer het niet. Geef hetzelfde gevalideerde object terug, zodat nieuwe waarden, volgorde, duplicaten en typen van gehele getallen behouden blijven.

Implementeer daarna de combinatie voor één pagina:

def fetch_items_page(page, page_size, *, timeout=DEFAULT_TIMEOUT, session=None):
    document = request_json(
        "/items",
        params={"page": page, "page_size": page_size},
        timeout=timeout,
        session=session,
    )
    return validate_items_page(document)

De API zelf accepteert paginawaarden van 1 tot en met 10 en paginagroottes van 1 tot en met 3; een deel buiten het bereik van een niet-lege dataset levert een 400 op. De CLI wijst lokaal ongeldige paginanummers en paginagroottes vóór HTTP af, terwijl de schemavalidator de werkelijke antwoordstructuur controleert.

Geef je validator een paar bewust onjuiste documenten voordat je verdergaat. Zet true waar een geheel getal hoort, voeg een sleutel toe die er niet hoort, verwijder een verplichte sleutel en beweer dat has_next waar is terwijl next_page None is. Elk daarvan hoort een exceptie op te werpen met een melding die vertelt welke regel is overtreden.

Waarom gebruik je hier type(value) is int in plaats van isinstance(value, int)?

Opdracht

Implementeer validate_items_page met de exacte sleutels op het hoogste niveau en per item, controles van gehele getallen en booleaanse waarden die bool niet als int accepteren, niet-lege tekst, begrensde paginanummers en paginagroottes, een niet-negatief totaal, een aantal items dat klopt met het gevraagde deel en exacte velden has_next/next_page. Geef hetzelfde object terug. Implementeer fetch_items_page als één verzoek naar /items met exacte paginaparameters en doorgegeven timeout/session, gevolgd door validatie.