Kapitel 11

Alle Codedateien dieses Kapitels herunterladen

11_6_1_Fehlercodes.cpp

Datei herunterladen

/*
 * Lösung für Übung 11.6.1 - Fehlercodes
 */
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include <httplib.h>
#include <iostream>
#include <string>
#include <map>

const std::map<int, std::string> categoryTitles = {
  { 1, "Anfrage ist in Bearbeitung" },
  { 2, "Alles in Ordnung" },
  { 3, "Anfrage wurde umgeleitet" },
  { 4, "Nicht gefunden" },
  { 5, "Server ist ausgelastet" }
};

std::string statusMessage(int httpStatusCode)
{
  int cat = httpStatusCode / 100;
  if (categoryTitles.find(cat) != categoryTitles.end())
  {
    return categoryTitles.at(cat);
  }
  return "";
}

// Alternative Lösung mit switch case
std::string statusMessageSwitch(int httpStatusCode)
{
  switch (httpStatusCode / 100)
  {
    case 1:
      return "Anfrage ist in Bearbeitung";
    case 2:
      return "Alles in Ordnung";
    case 3:
      return "Anfrage wurde umgeleitet";
    case 4:
      return "Nicht gefunden";
    case 5:
      return "Server ist ausgelastet";
    default:
      return "";
  }
}

int main()
{
  httplib::Client client("http://de.wikipedia.org");
  client.set_follow_location(true);
  httplib::Result result = client.Get("/w4godfgfkg");
  if (result != nullptr)
  {
    // Server wurde erreicht
    std::cout << result->status << ", " << result->reason << std::endl;
    std::cout << statusMessage(result->status) << std::endl;
    // Alternative Funktion
    std::cout << statusMessageSwitch(result->status) << std::endl;
  }
  else
  {
    // Server nicht erreicht
    std::cerr << "Verbindungsfehler" << std::endl;
  }
  return 0;
}

11_6_2_BuchladenJason.cpp

Datei herunterladen

/*
 * Lösung für Übung 11.6.2 -	Buchladen Jason
 */
#include <iostream>
#include <string>
#include <vector>
#include <json/json.h>

int main()
{
  std::vector<std::string> bookTitles;
  // Zeilenumbrüche können in JSON auch weggelassen werden
  const std::string jsonSource = 
                      "{"
                          "\"shopName\": \"Buchladen Jason\","
                          "\"books\": ["
                              "{"
                                  "\"title\": \"Python 3 Schnelleinstieg\","
                                  "\"pages\": 288"
                              "},"
                              "{"
                                  "\"title\": \"Machine Learning kompakt\","
                                  "\"pages\": 200"
                              "}"
                          "]"
                      "}";
  Json::Value shop;
  Json::Reader().parse(jsonSource, shop);

  Json::Value books = shop["books"];
  for (Json::Value book : books)
  {
    bookTitles.push_back(book["title"].asString());
  }

  // Natürlich könnte man das alles auch in einer einzelnen for-Schleife machen,
  // aber die Aufgabe war ja explizit, die Titel in einer Liste zu speichern.
  std::cout << "Folgende B\201cher sind im Lager: " << std::endl;
  for (std::string title : bookTitles)
  {
    std::cout << title << std::endl;
  }

  return 0;
}

11_6_3_IhrFreundlicherBuchladenImInternet.cpp

Datei herunterladen

/*
 * Lösung für Übung 11.6.3 - Ihr freundlicher Buchladen im Internet
 */
#define CPPHTTPLIB_OPENSSL_SUPPORT
#include <iostream>
#include <string>
#include <vector>
#include <json/json.h>
#include <httplib.h>

struct Book
{
  Book(const std::string title, int pages)
    : title(title), pages(pages)
  {
  }
  const std::string title;
  const int pages;
};

std::vector<Book> parseBooks(const std::string& jsonSource)
{
  std::vector<Book> result;
  Json::Value shop;
  Json::Reader().parse(jsonSource, shop);

  Json::Value books = shop["books"];
  for (Json::Value book : books)
  {
    result.push_back(Book(book["title"].asString(), book["pages"].asInt()));
  }
  return result;
}

int main()
{
  httplib::Client client("https://cpp.hasper.info");
  client.set_follow_location(true);

  // Get-Anfrage abschicken. Das Sonderzeichen Ü muss codiert werden
  // https://cpp.hasper.info/lösungen/11_6_3.json
  httplib::Result result = client.Get("/l%C3%B6sungen/11_6_3.json");
  if (result != nullptr)
  {
    // Server wurde erreicht
    if (result->status / 100 != 2)
    {
      std::cerr << "HTTP status: " << result->status
        << " - " << result->reason << std::endl;
      return 1;
    }
    std::vector<Book> books = parseBooks(result->body);
    for (Book book : books)
    {
      std::cout << book.title << ", " << book.pages << " Seiten." << std::endl;
    }
  }
  else
  {
    // Server nicht erreicht
    std::cerr << "Verbindungsfehler" << std::endl;
  }
  return 0;
}