0%

Mit einer API kommunizieren · Übung

Die Artikelseite validieren

Erfolgreiches Dekodieren von JSON belegt Syntax, nicht Bedeutung. Ergänze validate_items_page(document) und weise Daten außerhalb der geprüften Seitenvorgaben mit ValueError zurück.

Das Objekt auf oberster Ebene hat genau diese Schlüssel:

items, page, page_size, total, has_next, next_page

items ist eine Liste. Jeder Artikel ist ein Dictionary mit genau id, name, category und value. IDs und Werte sind ganze Zahlen; bool darf nicht als ganze Zahl durchgehen. Namen und Kategorien sind nicht leerer Text. Die Seite ist eine ganze Zahl von 1 bis 10, die Seitengröße eine ganze Zahl von 1 bis 3 und die Gesamtzahl eine nicht negative ganze Zahl.

Die Felder für die Seiteneinteilung müssen einen möglichen Ausschnitt aus dem Datenbestand beschreiben. Der Ausschnitt beginnt bei (page - 1) * page_size. Eine erfolgreiche Seite eines nicht leeren Datenbestands beginnt vor total, und die Artikelzahl entspricht dem kleineren Wert aus page_size und der Anzahl verbleibender Artikel. has_next gibt genau an, ob nach dieser Seite noch Artikel übrig sind. Ist es wahr, ist next_page gleich page + 1; andernfalls ist next_page gleich None. Bei einem leeren Datenbestand enthält Seite 1 keine Artikel und hat keine Folgeseite.

Baue das Dokument nicht neu auf und sortiere es nicht. Gib dasselbe validierte Objekt zurück, damit bisher nicht verwendete Werte, Reihenfolge, Duplikate und Integer-Typen erhalten bleiben.

Implementiere dann die Zusammensetzung für eine einzelne Seite:

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)

Die API selbst akzeptiert Seitenwerte von 1 bis 10 und Seitengrößen von 1 bis 3; ein Ausschnitt außerhalb eines nicht leeren Datenbestands führt zu einer 400. Die CLI weist lokal ungültige Seiten- und Seitengrößenwerte vor HTTP zurück, während die Schemavalidierung die tatsächliche Antwortstruktur prüft.

Gib deinem Validator bewusst falsche Dokumente, bevor du weitermachst. Setze true an eine Stelle für eine ganze Zahl, ergänze einen unerlaubten Schlüssel, entferne einen erforderlichen und behaupte, has_next sei wahr, während next_page gleich None ist. Jeder dieser Fälle sollte eine Ausnahme auslösen, deren Meldung die verletzte Regel benennt.

Warum verwendest du hier type(value) is int statt isinstance(value, int)?

Aufgabe

Implementiere validate_items_page mit den genauen Schlüsseln auf oberster Ebene und für Artikel, Integer-Prüfungen, die bool ausschließen, exakten Boolean-Prüfungen, nicht leerem Text, begrenzter Seite und Seitengröße, nicht negativer Gesamtzahl, einer zum angeforderten Ausschnitt passenden Artikelzahl und genauen Feldern has_next/next_page. Gib dasselbe Objekt zurück. Implementiere fetch_items_page als eine Anfrage an /items mit den genauen Seitenparametern, weitergereichtem Timeout und weitergereichter Session, gefolgt von der Validierung.