Jak widzisz w powyższym przykładzie, mimo że operacja nie powiodła się (otrzymaliśmy status Błąd ), serwer zwrócił nam kod 200 OK.

Podobne dokumenty
ASP.NET MVC. Podstawy. Zaawansowane programowanie internetowe Instrukcja nr 3

Modele danych walidacja widoki zorientowane na model

Specyfikacja API 1.0. Specyfikacja kontroli Konta systemu CashBill z wykorzystaniem API opartego na REST

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

Obiekt klasy jest definiowany poprzez jej składniki. Składnikami są różne zmienne oraz funkcje. Składniki opisują rzeczywisty stan obiektu.

Angular, cz. II. Tworzenie serwisów Web 2.0. dr inż. Robert Perliński

Programowanie Komponentowe WebAPI

Informacje ogólne. Karol Trybulec p-programowanie.pl 1. 2 // cialo klasy. class osoba { string imie; string nazwisko; int wiek; int wzrost;

Dokumentacja wstępna TIN. Rozproszone repozytorium oparte o WebDAV

A Zasady współpracy. Ocena rozwiązań punktów punktów punktów punktów punktów

Katalog książek cz. 3: Web Service

Budowa aplikacji ASP.NET z wykorzystaniem wzorca MVC

Tworzenie i wykorzystanie usług sieciowych

Laboratorium 7 Blog: dodawanie i edycja wpisów

Program szkolenia: REST i Microservices w PHP

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

JAX-RS czyli REST w Javie. Adam Kędziora

Kurs ASP.NET ASP.NET CORE APLIKACJE WEBOWE

Czym są właściwości. Poprawne projektowanie klas

Zaawansowane aplikacje internetowe laboratorium REST

Full Stack JavaScript z Angular i Nest. Dni: 5. Opis: Adresaci szkolenia

Użycie filtrów w widoku

Architektury Usług Internetowych. Laboratorium 2. Usługi sieciowe

Poznaj ASP.NET MVC. Kamil Cieślak Microsoft Student Partner

Gatesms.eu Mobilne Rozwiązania dla biznesu

Spring Web MVC, Spring DI

Aplikacje webowe z wykorzystaniem Node.js oraz Express

Dokumentacja REST API v 3.0. Kraków, 7 marca FreshMail, ul. Fabryczna 20a, Kraków tel , freshmail.

Programowanie obiektowe

Narzędzia i aplikacje Java EE. Usługi sieciowe Paweł Czarnul pczarnul@eti.pg.gda.pl

REFERAT O PRACY DYPLOMOWEJ

Jak napisać listę jednokierunkową?

Sposoby tworzenia projektu zawierającego aplet w środowisku NetBeans. Metody zabezpieczenia komputera użytkownika przed działaniem apletu.

Aktywności są związane z ekranem i definiują jego wygląd. Dzieje się to poprzez podpięcie do aktywności odpowiedniego widoku.

Sprawozdanie nr 4. Ewa Wojtanowska

Microsoft.NET: ASP.NET MVC + Entity Framework (Code First)

autor poradnika - KS Jak zamieszczać i edytować artykuły na szkolnej stronie internetowej

Okno logowania. Okno aplikacji. 1. Logowanie i rejestracja

Realizacja Aplikacji Internetowych 2013 laboratorium cz. 2 K.M. Ocetkiewicz

Jak posługiwać się edytorem treści

Przewodnik użytkownika (instrukcja) AutoMagicTest

Programowanie obiektowe

Czym jest stos i sterta?

Podręcznik Integracji

Katalog książek cz. 2

AJAX. Wykonał: Marcin Ziółkowski, AGH Kraków, AiR rok 5.

Instrukcja składania wniosku o dofinansowanie w systemie informatycznym IP na potrzeby konkursu nr 1/1.1.2/2015

Diagram klas UML jest statycznym diagramem, przedstawiającym strukturę aplikacji bądź systemu w paradygmacie programowania obiektowego.

Wykład 8: klasy cz. 4

Ajax. 1. Wprowadzenie. 2. Aplikacja serwerowa

Przewodnik użytkownika (instrukcja) AutoMagicTest

IIIIIIIIIIIIIIIMMIMMIII

Instalacja i konfiguracja serwera IIS z FTP

Ciekawym rozwiązaniem służącym do obsługi zdarzeń dla kilku przycisków w ramach jednej aktywności może być następujący kod:

Podstawy wzorca MVC MODEL KON- TROLER WIDOK. Odpowiada za wyświetlenie danych użytkownikowi. Zawiera dane aplikacji oraz jej logikę.

Temat: Ułatwienia wynikające z zastosowania Frameworku CakePHP podczas budowania stron internetowych

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

Maple i wykresy. 1.1 Najpierw należy się zalogować. Jak to zrobić zostało opisane w moim poprzednim tutorialu.

KURIER BY CTI. Instrukcja do programu DATA Informatycznej Zygmunt Wilder w Gliwicach WERSJA mgr Katarzyna Wilder DLA DPD

Zrąb JavascriptMVC. Krzysztof Płocharz. 6 kwiecień Uniwersytet Warszawski

Specyfikacja interfejsów usług Jednolitego Pliku Kontrolnego

Aby pobrać program FotoSender naleŝy na stronę lub i kliknąć na link Program do wysyłki zdjęć Internetem.

Serwis jest dostępny w internecie pod adresem Rysunek 1: Strona startowa solidnego serwisu

Podstawowa instrukcja obsługi STRON stron internetowych serwisu zrealizowanych w systemie zarządzania treścią Wordpress.

API System Partnerski

Programowanie zespołowe

Specyfikacja techniczna. mprofi Interfejs API

Deklaracja struktury w C++

Materiały oryginalne: ZAWWW-2st1.2-l11.tresc-1.0kolor.pdf. Materiały poprawione

Kontrola sesji w PHP HTTP jest protokołem bezstanowym (ang. stateless) nie utrzymuje stanu między dwoma transakcjami. Kontrola sesji służy do

PHP: bloki kodu, tablice, obiekty i formularze

Zygmunt Kubiak Instytut Informatyki Politechnika Poznańska

Webowy generator wykresów wykorzystujący program gnuplot

4 AS SP.NET MVC. Widok. Zaawansowane programowanie internetowe Instrukcja nr 4

Reporting Services. WinProg 2011/2012. Krzysztof Jeliński Dawid Gawroński 1 / 11

Zalogowanie generuje nowe menu: okno do wysyłania plików oraz dodatkowe menu Pomoc

Kurs walut. Specyfikacja projektu. Marek Zając

Aplikacje w środowisku Java

W celu uruchomienia kontrolera należy w katalogu głównym kontrolera z wiersza poleceń wydać następujące polecenie: $ java -jar target/floodlight.

Spis treści. Wprowadzenie 13

1. Pobieranie i instalacja FotoSendera

Instrukcja konfigurowania poczty Exchange dla klienta pocztowego użytkowanego poza siecią uczelnianą SGH.

Android poradnik programisty

Badania poziomu bezpieczeństwa portalu dostępowego do infrastruktury projektu PL-Grid

Przygotowanie do nowoczesnego programowania po stronie przeglądarki. (HTML5, CSS3, JS, wzorce, architektura, narzędzia)

W czystym JavaScripcie zasięgi zmiennych tworzone były poprzez funkcje anonimowe, w AngularJS posiadamy kontrolery, które także są funkcjami.

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL IV TI 6 godziny tygodniowo (6x15 tygodni =90 godzin ),

Wprowadzenie. Narzędzia i środowiska programistyczne. Laboratorium 1. Prowadzący: Kierunek: Semestr: Rok: Tomasz Gądek Informatyka Zimowy 2

Opis protokołu komunikacji programu mpensjonat z systemami zewnętrznymi (np. rezerwacji online)

Tworzenie witryn internetowych PHP/Java. (mgr inż. Marek Downar)

Terytorialna analiza danych

MAMP: Można to pobrać i zainstalować z XAMPP: Można go pobrać i zainstalować z

PHP: bazy danych, SQL, AJAX i JSON

Spis wzorców. Działania użytkownika Strona 147 Obsługa większości Działań użytkownika za pomocą kodu JavaScript przy użyciu metod obsługi zdarzeń.

OpenLaszlo. OpenLaszlo

plansoft.org Zmiany w Plansoft.org Błyskawiczny eksport danych PLANOWANIE ZAJĘĆ, REZERWOWANIE SAL I ZASOBÓW

Referat z przedmiotu Technologie Internetowe SPIS TREŚCI

Transkrypt:

Ostatnio w pracy napotkałem drobne problemy związane z przekazywaniem parametrów do ApiControllera. Z tego krótkiego wpisu dowiesz się w jaki sposób parametry akcji są bindowane z danymi zawartymi w żądaniu. Dodatkowo zaprezentuję i omówię niektóre metody z protokołu HTTP. Z artykułu dowiesz się jak utworzyć kontroler WebAPI i ustawić format zwracanych przez niego danych na JSON. Czym jest REST? REST jest to sposób komunikacji oparty na protokole HTTP. Cechują go prosta budowa i łatwość implementacji. Polega on na ujednoliceniu sposobu wymiany danych pomiędzy klientem a serwerem. Systemy informatyczne używające RESTa są zrozumiałe i nie wymagają tak szczegółowej dokumentacji jak API budowane w innych standardach. Potęga RESTa polega na tym, że do zbudowania API wykorzystuje on jedynie metody dostępne w protokole HTTP, są to: Post, Get, Put, Delete. Dzięki temu użytkownik danego repozytorium podświadomie rozumie działanie systemu bez konieczności długiego wdrażania się. Dawniej budując API aplikacji także korzystało się np. z protokołu HTTP, jednak nie było tam podejścia RESTowego. Wywołując jakąś akcję z API pod adresem api/deleteuser/5 otrzymywaliśmy odpowiedź w formacie json lub xml zawierającą odpowiedź czy zabieg się udał np.: 1 -- response -- 2 200 OK 3 Cache-Control: no-cache 4 Content-Type: application/json; 5 6 "Status":"Błąd", "Message":"Użytkownik o tym ID nie istnieje" Jak widzisz w powyższym przykładzie, mimo że operacja nie powiodła się (otrzymaliśmy status Błąd ), serwer zwrócił nam kod 200 OK. W przypadku trzymania się stylu REST, serwer zwróciłby odpowiedź 200 tylko w wypadku usunięcia użytkownika, a w przypadku błędu jakikolwiek kod oznaczający błąd. Trzymając się standardu REST, użytkownik API ma pewność, że każde repozytorium wystawione w API obsługuje 5 przypadków: GET api/user zwróci listę wszystkich użytkowników GET api/user/1 zwróci użytkownika o identyfikatorze 1 POST api/user doda nowego użytkownika Karol Trybulec p-programowanie.pl 1

PUT api/user/1 edycja użytkownika o identyfikatorze 1 (nadpisanie) DELETE api/user/1 usunięcie użytkownika o identyfikatorze 1 Powyższy przykład obrazuje całą siłę RESTa. Po pierwsze otrzymujemy uporządkowane API więc nie musimy domyślać się pod jaki adres wysłać POSTa żeby usunąć użytkownika. Gdyby nie był to REST usunięcie użytkownika mogłoby się odbyć przez POST api/deleteuser. Dodatkowo nie musimy sprawdzać treści odpowiedzi od serwera, wszystkiego dowiemy się już po kodzie odpowiedzi. Dlaczego REST będzie zawsze używany? REST jest szeroko wykorzystywany ponieważ jest prosty i intuicyjny. Bardzo dobrze sprawdza się pod względem wieloplatrofmowości gdzie nie sprawdza się już np. SOAP. Serwer postawiony w NodeJS korzystający z podejścia RESTfull API zajmuje zaledwie kilka linijek kodu. Dla porównania funkcjonalność REST jest automatycznie wbudowana w protokół HTTP i nie wymaga żadnych dodatkowych nakładów pracy. Wdrożenie SOAP jest już bardziej pracochłonne np. ze względu na konieczność definiowania XML Schemas. REST jest wygodny zarówno dla programisty piszącego kod jak i dla odbiorcy. Narzuca na obie strony pewne umowne standardy, dzięki czemu programista nie musi się zastanawiać od jakiej strony ugryźć problem lub jakie metody wystawić w nowym fragmencie API. Podejście REST stało się wygodnym standardem implementowanym wszędzie tam, gdzie nie potrzeba bardziej zaawansowanych narzędzi, choć czasem prowadzi to do nadmiarowości. WebAPI wspiera RESTa Chcąc nie chcąc, standard REST jest wspierany przez framework ASP.NET MVC. Decydując się na użycie WebAPI wykorzystując ApiControllery najlepszym rozwiązaniem dla Ciebie będzie użycie RESTa. Ten fakt znajduje potwierdzenie w kilku szczegółach, o których dowiesz się z treści artykułu. Tworzenie kontrolera WebAPI Do budowania wszelkich API oraz repozytoriów naszych aplikacji najlepiej użyć kontrolerów WebAPI. Są to wszelkie kontrolery dziedziczące jawnie z klasy ApiController. Różnica pomiędzy zwykłym kontrolerem a WebAPI kontrolerem jest taka, że zwykłe kontrolery zwracają widoki a WebAPI kontrolery zwracają dane (w postaci JSON lub XML). Utwórz nowy projekt ASP.NET MVC, następnie kliknij prawym przyciskiem myszy na katalog Controllers i wybierz pozycję Add Web API Controller v2. Karol Trybulec p-programowanie.pl 2

1 public class TestController : ApiController 2 3 [HttpGet] 4 public IEnumerable<String> Akcja() 5 6 return new List<String>() "aaa", "bbb" ; 7 8 Kontroler stworzony przeze mnie na potrzeby artykułu posiada tylko jedną metodę. Będziemy ją modyfikować w zależności od potrzeb. Domyślny format zwracanych danych Kontrolery WebAPI domyślnie zwracają dane w postaci XML. Można to bardzo łatwo sprawdzić uruchamiając projekt wchodząc pod adres localhost:port/api/test. Ponieważ format JSON jest dla mnie bardziej przyjazny a także bardziej przyjazny dla JavaScripta, zmienimy domyślny format zwracanych danych. W tym celu należy otworzyć plik WebApiConfig.cs znajdujący się w katalogu App_Start. Z kolekcji SupportedMediaTypes usuwamy nagłówek application/xml. Dzięki temu dane wyjściowe kontrolera zostaną automatycznie niejawnie przekształcone na JSON. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public static void Register(HttpConfiguration config) config.maphttpattributeroutes(); config.routes.maphttproute( name: "DefaultApi", routetemplate: "api/controller/id", defaults: new id = RouteParameter.Optional ); // usuwamy content-type XML co spowodouje wyświetlanie JSON var xmltype = config.formatters.xmlformatter.supportedmediatypes.firstordefault(o => o.mediatype == "application/xml"); config.formatters.xmlformatter.supportedmediatypes.remove(xmltype); Warto zauważyć, że kontrolery WebAPI posiadają własne definicje rutingów, co jest nawet zrozumiałe ponieważ stanowią odrębny element systemu. Możemy mieć z tym problem budując wspólne API dla poszczególnych Areas. Karol Trybulec p-programowanie.pl 3

Wysyłanie danych przez GET i POST Protokół HTML jest protokołem bardzo prostym, służącym do przesyłania informacji pomiędzy klientem a serwerem. Jest to protokół bezstanowy, w żadnym momencie nie ma nawiązanego stałego połączenia pomiędzy dwoma odbiorcami. Nigdzie nie są zapisywane żadne informacje o połączeniu lub autoryzacji. Jest to protokół zapytań i odpowiedzi, klient wysyła zapytanie określonego typu i dostaje odpowiedź. Do każdego zapytania i odpowiedzi jest dołączona treść. Zarówno zapytania do serwera jak i jego odpowiedzi można monitorować a także nimi manipulować. Do podglądu komunikacji służą wbudowane w przeglądarkę narzędzia, które znajdują się w konsoli. Konsolę uruchamiasz naciskając F12. Przechodząc do zakładki Sieć zobaczysz wszelkie zapytania oraz ich odpowiedzi. Do wysyłania własnych spreparowanych żądań warto posłużyć się tzw. REST Klientem. Ja używam wtyczki do Firefoxa o nazwie Open HttpRequester. Umożliwia mi ona wysyłanie żądań na na dowolny adres, dowolnego typu i z dowolną treścią. Głównymi typami zapytań, które nas interesują są POST oraz GET. Zapytania POST służą do wysyłania informacji do serwera w postaci niejawnej. Dzieje się to np. w momencie logowania lub rejestracji nowego konta na jakiejkolwiek stronie. Dane wpisane w formularz zostają wysłane do serwera, jednak ich nie widzimy (chyba że podglądniemy je w konsoli analizując zapytanie). Zapytania GET służą do wysyłania zapytań w postaci jawnej a dokładnej w postaci adresu URL. Wszystko co wpisujesz w pasku przeglądarki jest żądaniem typu GET. Są używane po pierwsze do ładowania głównych widoków stron, a także do budowania hierarchii nawigacji. Co ważne jest to założenie specyfikacji. Metody GET i POST można ze sobą miksować, tzn przesłać przez GET parametr w treści albo przez POST parametr w adresie URL. Bindowanie parametrów ApiController Przekazywanie danych do metod wystawionych w kontrolerach nosi nazwę bindowania parametrów. Bindowanie parametrów polega na dopasowaniu parametrów podanych wewnątrz zapytania do parametrów podanych jako argumenty akcji kontrolera. Karol Trybulec p-programowanie.pl 4

W tym artykule przedstawiam mechanizm bindowania parametrów konkretnie do kontrolerów WebAPI a więc tych dziedziczących jawnie z ApiController. Istnieje cała pula problemów, których ten artykuł nie poruszy. Jeżeli chcesz bardziej zagłębić się w temat musisz przeczytać jakiś kurs ASP.NET MVC. Przekazywanie parametrów typów prostych Jeżeli parametry kontrolera są typami prostymi, wtedy WebAPI próbuje automatycznie zbindować je z adresu URL. Typami prostymi są wszelkie typy wywodzące się z przestrzeni nazw System a więc np. int, string, float itd. Tworzę nową metodę zwracającą typ dynamic. Dzięki temu będę mógł zwrócić obiekt anonimowy, który zostanie automatycznie przekształcony w JSON. Dzięki temu nie muszę bawić się w tworzenie modeli na potrzeby artykułu. Rozważmy przykład: Karol Trybulec p-programowanie.pl 5

1 public class TestController : ApiController 2 3 [HttpPost] 4 public dynamic Akcja(string imie, int wiek) 5 6 return new 7 8 Osoba = new 9 Imie = imie, 10 Wiek = wiek 11 12 ; 13 14 Wyślę teraz zapytanie typu POST na adres api/test?imie=karol&wiek=23. Karol Trybulec p-programowanie.pl 6

Bindowanie odbyło się zgodnie z planem. Jednak parametry zostały przesłane jako elementy adresu URL. Przez treść zapytania Chcąc przesłać parametry prawilnie przez treść zapytania, tak jak powinno to wyglądać w metodzie POST, należy nazwę parametru poprzedzić atrybutem [FromBody]. Niestety pojawiają się tutaj pierwsze ograniczenia. Możemy przesłać tylko jeden parametr będący typem prostym poprzedzony atrybutem [FromBody]. Dodatkowo należy ustawić kodowanie na application/x-www-form-urlencoded. Użycie czegokolwiek innego będzie skutkować pustą wartością. Karol Trybulec p-programowanie.pl 7

Ciekawy jest także sposób formatowania treści zapytania. Przesyłając typ prosty przez treść zapytania należy przedstawić go w postaci =wartość. Użycie czegokolwiek innego będzie skutkować pustą wartością. Sprawdźmy przykład: 1 public class TestController : ApiController 2 3 [HttpPost] 4 public dynamic Akcja([FromBody] string imie) 5 6 return new 7 8 Osoba = new 9 Imie = imie 10 11 ; 12 13 Treść zapytania i jego wynik wygląda następująco: Przez URL i przez treść zapytania Nic nie stoi na przeszkodzie aby połączyć ze sobą dwa powyższe sposoby przekazywania parametrów typów prostych. Przykładowa metoda może wyglądać następująco: Karol Trybulec p-programowanie.pl 8

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 public class TestController : ApiController [HttpPost] public dynamic Akcja([FromBody] string imie, int wiek, string strona) return new Osoba = new Imie = imie, Wiek = wiek, Strona = strona ; Treść zapytania i jego wynik wygląda następująco: Wszystko działa poprawnie. Nasuwają się wnioski, po pierwsze sposób przesyłania typów prostych przez treść zapytania został przez Microsoft zaimplementowany dość dziwnie. Możesz przesłać tylko jeden parametr przez treść zapytania, resztę trzeba wcisnąć poprzez parametry w URL. Karol Trybulec p-programowanie.pl 9

Przekazywanie parametrów typów złożonych Typy złożone czyli wszelkiego rodzaju obiekty i modele są automatycznie niejawnie przekazywane przez treść zapytania. W ich wypadku bardzo ważne jest określenie w jakim formacie dane trafiają do serwera a więc określenie Content-type. Przykładowy kontroler może wyglądać następująco: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Osoba public string Imie get; set; public int Wiek get; set; public class TestController : ApiController [HttpPost] public dynamic Akcja(Osoba arg) return arg; Treść i wynik zapytania: Przez URL Nie jest to zbyt dobry pomysł aby przekazywać typy złożone przez adres URL, jednak można osiągnąć taki efekt dopisując do parametru atrybut [FromUri]. Przykładowa klasa: Karol Trybulec p-programowanie.pl 10

1 2 3 4 5 6 7 8 9 10 11 12 13 14 public class Model public string Imie get; set; public int Wiek get; set; public class TestController : ApiController [HttpPost] public dynamic Akcja([FromUri] Model arg) return arg; Treść zapytania oraz jego wynik: Podsumowanie Przekazywanie parametrów do WebAPI kontrolerów jest sprawą nieskomplikowaną. Drobne problemy może sprawdzić budowanie zapytań dla parametrów o typach prostych. Jeżeli informacje zawarte w artykule nie rozwiązały Twojego problemu, zapoznaj się z własnym binderem. W Asp.NET MVC możliwe jest napisanie własnego bindera dziedziczącego z klasy IModelBinder, jednak jest to temat na osobny artykuł. Karol Trybulec p-programowanie.pl 11