Kapitel 11
Alle Codedateien dieses Kapitels herunterladen
11_6_1_Fehlercodes.cpp
/*
* 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
/*
* 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
/*
* 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;
}