Kontynuuję zabawę z AspNetCore. W poprzednim artykule zrobiłem szkielet aplikacji, który udało się uruchomić.
Rozgrzewka
Czas na prosty kontroler API, który zwraca dane w postaci np. JSONa, które mogą zostać użyte np. w architekturze AJAX.
W katalogu Controllers należy utworzyć nową klasę SimpleApiController, która dziedziczy z Controller. Do tej klasy dodajemy metodę Indeks zwracającą IActionResult.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; using Microsoft.AspNetCore.Mvc; namespace AspNetCoreTest.Controllers { public class SimpleApiController : Controller { public IActionResult Index() { return Json(new { FirstName = "Piotr", LastName = "Nowak", LastUpdate = DateTime.Now }); } } } |
Po skompilowaniu i uruchomieniu można zaryzykować wpisanie do przeglądarki adresu http://localhost:5555/SimpleApi. Wynikiem powinno być coś w rodzaju
1 {"firstName":"Piotr","lastName":"Nowak","lastUpdate":"2016-11-21T12:15:52.6196462+01:00"}
Czego nie widać w kodzie?
Kilka słów wyjaśnienia. Po pierwsze jakie jest powiązanie nazwy klasy, nazwy metody i URLa, który jest powiązany z wywoływaną metodą. Definicje tych zależności znajdują się w metodzie Configure klasy Startup. Definicja wygląda tak:
1 2 3 4 5 6 |
app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); |
Domyślny szablon routowania czyli wyszukiwania klas i metod na podstawie adresu URL składa się z trzech elementów oddzielonych ukośnikami
- Nazwa kontrolera (jeśli zostanie pominięta to użyty będzie HomeController). Suffix „Controller” będzie dodany automatycznie stąd „SimpleApi” w przykładzie routuje na „SimpleApiController”
- Nazwa akcji (jeśli zostanie pominięta to będzie użyta akcja Index). W przykładzie powyżej wystąpił właśnie przypadek, gdzie Index został użyty jako domyślny.
- Nazwa parametru, który może być przekazany do metody.
Metoda z parametrem
Aby przetestować pkt 2 i 3 z powyżej opisanej reguły routowania możemy dopisać metodę
1 2 3 4 5 6 7 |
public IActionResult PowerOfPi(int id) { return Json(new { Result = Math.Pow(Math.PI, id) }); } |
Test pierwszy to użycie adresu http://localhost:5555/SimpleApi/PowerOfPi/ . Została w nim wskazana metoda w dosłownym brzemieniu nazwy. Parametr został pominięty, więc zostanie przyjęta wartość domyślna. Dla int jest to 0. Wynik jaki otrzymamy to
1 |
{"result":1} |
Drugi test to użycie adresu http://localhost:5555/SimpleApi/PowerOfPi/3 . Tutaj jawnie podajemy wartość 3. Rezultat na wyjściu to :
1 |
{"result":31.006276680299816} |
Ważne
- Nazwa parametru musi być zgodna z nazwą użytą w szablonie a więc „id”. Przemianowanie nazwy argumentu metody spowoduje, że nie zostanie wstrzyknięta wartość rozpoznana w URLu
- Podanie wartości niezgodnej z oczekiwanym typem spowoduje zignorowanie wartości. Zatem wywołanie http://localhost:5555/SimpleApi/PowerOfPi/3.4 spowoduje, że metoda zostanie wywołana z parametrem 0. Oczywiście można zmienić typ danych z int na double. Wtedy będą akceptowane wartości z separatorem dziesiętnym w postaci kropki