Webservices mit C++: Routing von Anfragen
Ein exemplarischer Webservice soll ein zentral gesteuertes Routing von Anfragen lernen. Wir zeigen, wie das geht.
- Oliver Lau
Dem Beispiel-Webservice aus den beiden vorangehenden Teilen dieser Serie (Teil 1, Teil 2) mangelt es ein wenig an Übersichtlichkeit, obwohl er nur ein paar Hundert Zeilen umfasst. Es fängt damit an, dass er Anfragen in einer if
/else
-Kaskade nach URL-Pfad und HTTP-Methode unterscheidet und den jeweils passenden Codeblock dazu ausführt. Bei nur zwei, drei möglichen Optionen mag das gerade so noch angehen, aber wenn es mehr werden, verliert man schnell den Überblick.
Obendrein geschieht das alles in einer einzigen Methode, und zwar der Klasse http_worker
, die verantwortlich für das Abwickeln sämtlicher Verbindungen zeichnet. Auf einem hochauflösenden Monitor im Hochkantformat kann man den Code der Klasse nur bei einem Schriftgrad von 5 Punkt komplett sehen, was für sich schon ein Grund ist, die Schere anzusetzen, um den einen oder anderen Codeschnipsel woanders hinzuschieben. Schwerer wiegt jedoch, dass der http_worker
funktional undurchsichtig ist, weil er gleich drei fundamentale Aufgaben erledigt: Anfragen annehmen, routen und behandeln.
Die Definition des Routings, also welcher Endpunkt welche Aktion auslösen soll, ist an zentraler Stelle viel besser aufgehoben: in der main()
-Funktion des Webservice, dort wo auch die http_worker
, deren Threads und der I/O-Kontext ins Leben gerufen werden. Und sämtliche Aktionen gliedert man sinnvollerweise als Handler-Funktionen in eine oder mehrere Dateien aus. Wenn man dann dem http_worker
die Routing-Informationen mitgibt, muss der in seiner Methode process_request()
nur noch den Router mit der Weiterleitung der Anfrage beauftragen, aber nicht mehr selbst darüber entscheiden.