Aus dem Kurs: Web-APIs mit ASP.NET Core 8

Mehrere Elemente zurückgeben – Tutorial zu ASP.NET Core

Aus dem Kurs: Web-APIs mit ASP.NET Core 8

Mehrere Elemente zurückgeben

Der erste Schritt bei der tatsächlichen Implementierung der API ist es, alle Produkte zurückzugeben, also mehrere Elemente. Da gibt es zwei Ansätze. Der Einfachste ist so intuitiv und simpel, dass er eigentlich keiner weiteren Erklärungen bedarf. Wir haben eine Methode GetAllProducts() oder GetProducts(), wie wir sie vorher genannt haben. Die wird per HTTP-Methode GET aufgerufen, zu erkennen an dem HttpGet-Attribut und an dem Methodennamen, der mit Get beginnt und der Rückgabewert ist IEnumerable<Product>. Wir können auch ein Array nehmen oder eine Liste, aber das wird zurückgegeben, einfach ein paar Produkte. Und innen drin greifen wir auf unseren Datenbankkontext zu, dort auf die Products-Eigenschaft – zur Erinnerung, das ist ja die Liste der Produkte – und das geben wir dann einfach zurück. So einfach ist das, also schnell rüber in die Entwicklungsumgebung, in unseren ProductsController. Wir haben ja hier schon unsere Methode GetProducts(). Ich nenne die jetzt tatsächlich GetAllProducts() und als Rückgabewert nehme ich IEnumerable<Product> Und dieses Product probieren wir durch den ProductsController zu ersetzen, weil Product ist in HPlusSport.API.Models definiert. Das haben wir noch nicht per using eingebunden, aber wenn wir draufklicken oder Strg+Punkt, dann erfolgt das. D.h., using ist da, hier entsprechend korrekt ergänzt. Jetzt brauchen wir noch unseren ShopContext und ich nenne den immer ganz gerne _context, also "private readonly ShopContext _context;" und den befülle ich per Dependency Injection im Konstruktor des Controllers. Es ist ja eine Klasse und die kann deswegen auch einen ProductsController haben und ich kann das einfach so per Dependency Injection hier integrieren und setze dann _context auf den übergebenen ShopContext. Und damit bekomme ich eine Instanz dieses Kontextes. Ich muss also nicht den Kontext automatisch instanziieren bspw. Und jetzt ist meine Implementierung simpel. Also, ich greife auf context.Products zurück. Das ist jetzt ein DbSet und das kann ich z.B. in eine Liste oder in ein Array umwandeln, was ich halt für einen Datentyp brauche, und dann gebe ich das einfach zurück. That's it – na ja, beinahe. Wenn ich das jetzt ausführe, habe ich ein Problem, denn ich krieg keine Produkte. Wir haben hier diese seed-Methode, die beim Erzeugen des Modells aufgerufen wird. Aber das Erzeugen des Modells muss ich antriggern. Es ist ein bisschen unintuitiv. Wie funktioniert das? Mache ich im Konstruktor. Ich gehe auf den _context, dann auf .Database und dann gibt es eine Methode, die heißt EnsureCreated(), also stell sicher, dass die Datenbank auch erzeugt worden ist. Wenn sie das schon ist, passiert nichts. Wenn sie noch nicht erzeugt wurde, dann findet dieser Modellerzeugungschritt statt, inklusive des Befüllens, und dann sind die Daten da. Jetzt führen wir das aus. Vorher schauen wir uns noch kurz die URL an, was für eine Route haben wir denn? api/controller-Name, also api/Products und dann haben wir eben eine Action-Methode, die für HttpGet zuständig ist. D.h. ein GET Request an api/Product sollte uns alle Produkte liefern. Schauen wir mal, wir könnten jetzt zwar wieder Postman zu Rate ziehen, aber Sie erinnern sich, wir haben ja auch Swagger. Also Endpunkt: /api/Products. Ich klicke auf "Try ist out", gehe auf Execute. Jetzt wird eine HTTP-Anfrage gemacht, hier unten sieht man es klein, an unseren Server, /api/Products. Was kommt denn zurück? Es kommt zurück JSON, und zwar eine ganze Menge JSON alle Produkte durchnummeriert von 1 bis 33. D.h., wir haben jetzt unseren ersten Endpunkt erstellt, der automatisch alle Produkte zurückliefert, und zwar automatisch im JSON-Format. Die Methode gibt Produkte zurück, die Umwandlung in JSON, das übernimmt ASP.NET Core Web API.

Inhalt