44

Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

  • Upload
    others

  • View
    5

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17
Page 2: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Tytuł oryginału: Designing Evolvable Web APIs with ASP.NET

Tłumaczenie: Robert Górczyński

ISBN: 978-83-283-2391-9

© 2016 Helion S.A

Authorized Polish translation of the English edition of Designing Evolvable Web APIs with ASP.NET 9781449337711 © 2014 Glenn Block, Pablo Cibraro, Pedro Felix, Howard Dierking, and Darrel Miller

This translation is published and sold by permission of O’Reilly Media, Inc., which owns or controls all rights to publish and sell the same.

All rights reserved. No part of this book may be reproduced or transmitted in any form or by any means, electronic or mechanical, including photocopying, recording or by any information storage retrieval system, without permission from the Publisher.

Wszelkie prawa zastrzeżone. Nieautoryzowane rozpowszechnianie całości lub fragmentu niniejszej publikacji w jakiejkolwiek postaci jest zabronione. Wykonywanie kopii metodą kserograficzną, fotograficzną, a także kopiowanie książki na nośniku filmowym, magnetycznym lub innym powoduje naruszenie praw autorskich niniejszej publikacji.

Wszystkie znaki występujące w tekście są zastrzeżonymi znakami firmowymi bądź towarowymi ich właścicieli.

Autor oraz Wydawnictwo HELION dołożyli wszelkich starań, by zawarte w tej książce informacje były kompletne i rzetelne. Nie biorą jednak żadnej odpowiedzialności ani za ich wykorzystanie, ani za związane z tym ewentualne naruszenie praw patentowych lub autorskich. Autor oraz Wydawnictwo HELION nie ponoszą również żadnej odpowiedzialności za ewentualne szkody wynikłe z wykorzystania informacji zawartych w książce.

Wydawnictwo HELIONul. Kościuszki 1c, 44-100 GLIWICEtel. 32 231 22 19, 32 230 98 63e-mail: [email protected]: http://helion.pl (księgarnia internetowa, katalog książek)

Pliki z przykładami omawianymi w książce można znaleźć pod adresem: ftp://ftp.helion.pl/przyklady/noapie.zip

Drogi Czytelniku!Jeżeli chcesz ocenić tę książkę, zajrzyj pod adres http://helion.pl/user/opinie/noapieMożesz tam wpisać swoje uwagi, spostrzeżenia, recenzję.

Printed in Poland.

• Kup książkę• Poleć książkę • Oceń książkę

• Księgarnia internetowa• Lubię to! » Nasza społeczność

Page 3: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

3

Spis treści

Wprowadzenie ................................................................................................................... 13

Wstęp ................................................................................................................................ 17Dlaczego należy przeczytać tę książkę? 17Co trzeba wiedzieć, aby jak najwięcej skorzystać z tej książki? 18Jakie informacje zawiera ta książka? 19

Część I. Podstawy ......................................................................................................................19Część II. Praktyczne programowanie API .............................................................................20Część III. Podstawowe zasady Web API ................................................................................20

Konwencje zastosowane w książce 20Użycie przykładowych kodów 21Podziękowania 22

Rozdział 1. Internet, World Wide Web i HTTP ........................................................................ 23Architektura sieci 24

Zasób ...........................................................................................................................................25URI ..............................................................................................................................................25Cool URI ....................................................................................................................................26Reprezentacja .............................................................................................................................26Typ danych .................................................................................................................................27

HTTP 29Wykraczamy poza HTTP 1.1 ..................................................................................................29Wymiana komunikatów HTTP ..............................................................................................30Pośredniki ..................................................................................................................................32Rodzaje pośredników ...............................................................................................................33Metody HTTP ............................................................................................................................33Nagłówki ....................................................................................................................................36Kody stanu HTTP .....................................................................................................................37Negocjacja treści ........................................................................................................................38Buforowanie ...............................................................................................................................38Uwierzytelnianie .......................................................................................................................42

Poleć książkęKup książkę

Page 4: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

4 Spis treści

Schematy uwierzytelniania ...................................................................................................... 42Dodatkowe schematy uwierzytelniania ................................................................................. 43

Podsumowanie 44

Rozdział 2. Web API ............................................................................................................. 45Co to jest Web API? 45Co w kwestii usług sieciowych SOAP? 45Korzenie Web API 46Początek rewolucji Web API 46Zwrócenie uwagi na sieć 47Wskazówki dla Web API 47Typy danych charakterystyczne dla domeny 48Profile typów danych 49Wiele reprezentacji 50Style API 51

Model dojrzałości Richardsona .............................................................................................. 52RPC (poziom 0 w modelu dojrzałości Richardsona) ........................................................... 52Zasoby (poziom 1 w modelu dojrzałości Richardsona) ...................................................... 54Metody HTTP (poziom 2 w modelu dojrzałości Richardsona) ......................................... 56Pokonanie przepaści na drodze ku API zorientowanemu na zasoby ................................ 58Hipermedia (poziom 3 w modelu dojrzałości Richardsona) ............................................. 58REST ........................................................................................................................................... 63Ograniczenia REST .................................................................................................................. 63

Podsumowanie 65

Rozdział 3. Podstawy ASP.NET Web API ................................................................................ 67Najczęściej spotykane scenariusze 67

Pierwsza klasa programowania HTTP .................................................................................. 68Jednakowe możliwości podczas programowania po stronie klienta i serwera ................ 69Elastyczna obsługa różnych formatów .................................................................................. 70Nigdy więcej „tworzenia kodu z nawiasami ostrymi” ......................................................... 70Możliwość stosowania testów jednostkowych ...................................................................... 70Wiele opcji w zakresie hostingu ............................................................................................. 71

Rozpoczęcie pracy z ASP.NET Web API 72Nowy projekt Web API 75

Plik WebApiConfig.cs .............................................................................................................. 76Plik ValuesController.cs .......................................................................................................... 78

„Witaj, Web API!” 79Utworzenie usługi ..................................................................................................................... 79Klient .......................................................................................................................................... 86Host ............................................................................................................................................ 86

Podsumowanie 87

Poleć książkęKup książkę

Page 5: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Spis treści 5

Rozdział 4. Architektura przetwarzania ................................................................................ 89Warstwa hostingu 91Warstwa potoku procedur obsługi komunikatów 93

Obsługa tras ...............................................................................................................................95Warstwa obsługi kontrolera 96

Klasa bazowa ApiController ....................................................................................................97Podsumowanie 103

Rozdział 5. Aplikacja ...........................................................................................................105Dlaczego ewolucja? 106

Bariery na drodze ewolucji ................................................................................................... 107Jaki jest koszt zmiany? ........................................................................................................... 108Dlaczego po prostu nie wersja? ............................................................................................ 110Przystępujemy do pracy ........................................................................................................ 113

Cele aplikacji 113Cele ........................................................................................................................................... 113Możliwości .............................................................................................................................. 114

Model informacji 114Subdomeny ............................................................................................................................. 115Powiązane zasoby ................................................................................................................... 116Grupy atrybutów .................................................................................................................... 117Kolekcje grup atrybutów ....................................................................................................... 117Model informacji kontra typ danych .................................................................................. 118Kolekcje zgłoszeń błędów ..................................................................................................... 119

Modele zasobów 119Zasób główny .......................................................................................................................... 119Zasoby wyszukiwania danych .............................................................................................. 120Kolekcja zasobów ................................................................................................................... 120Zasób elementu ...................................................................................................................... 120

Podsumowanie 123

Rozdział 6. Projekt i wybór typu danych ..............................................................................125Samoopisywanie się 125Rodzaje kontraktów 126Typy danych 126

Proste formaty ........................................................................................................................ 126Popularne formaty ................................................................................................................. 128Nowe formaty ......................................................................................................................... 129Typy hipermediów ................................................................................................................. 131Eksplozja typów danych ........................................................................................................ 132Ogólne typy danych i profile ................................................................................................ 132Inne typy hipermediów ......................................................................................................... 136

Poleć książkęKup książkę

Page 6: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

6 Spis treści

Typy relacji łączy 137Semantyka ................................................................................................................................ 137Zastąpienie osadzonych zasobów ......................................................................................... 139Warstwa pośrednia ................................................................................................................. 139Dane odwołania ...................................................................................................................... 140Przepływ zdarzeń w aplikacji ................................................................................................ 141Składnia .................................................................................................................................... 142Doskonałe połączenie ............................................................................................................ 145

Opracowanie kontraktu nowego typu danych 145Wybór formatu ....................................................................................................................... 145Włączenie obsługi hipermediów .......................................................................................... 146Opcjonalne, obowiązkowe, pominięte, stosowalne ........................................................... 147Metadane osadzone kontra zewnętrzne .............................................................................. 148Rozszerzalność ........................................................................................................................ 148Rejestracja typu danych ......................................................................................................... 150

Opracowanie nowych relacji łączy 151Standardowe relacje łącza ...................................................................................................... 151Rozszerzenia relacji łączy ...................................................................................................... 152Osadzone relacje łączy ........................................................................................................... 152Rejestracja relacji łącza ........................................................................................................... 153

Typy danych w domenie monitorowania zgłoszeń błędów 153Lista zasobów .......................................................................................................................... 153Zasób elementu ....................................................................................................................... 155Zasób wykrycia ....................................................................................................................... 156Zasób wyszukiwania ............................................................................................................... 157

Podsumowanie 157

Rozdział 7. Tworzenie API .................................................................................................. 159Projekt 159Pobranie kodu źródłowego 160Przygotowanie implementacji w stylu BDD 160Nawigacja po rozwiązaniu 161Pakiety i biblioteki 161Samohostowanie 162Modele i usługi 163

Zgłoszenie błędu i magazyn dla zgłoszeń błędów .............................................................. 163Klasa IssueState ....................................................................................................................... 164Klasa IssuesState ..................................................................................................................... 164Klasa Link ................................................................................................................................ 166Klasa IssueStateFactory .......................................................................................................... 166Klasa LinkFactory ................................................................................................................... 167Klasa IssueLinkFactory .......................................................................................................... 168

Poleć książkęKup książkę

Page 7: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Spis treści 7

Kryteria akceptacji 169Funkcjonalność: pobieranie zgłoszeń błędów 172

Pobieranie zgłoszenia błędu ................................................................................................. 174Pobieranie otwartych i zamkniętych zgłoszeń błędów ..................................................... 177Pobieranie nieistniejącego zgłoszenia błędu ...................................................................... 179Pobieranie wszystkich zgłoszeń błędów .............................................................................. 179Pobieranie wszystkich zgłoszeń błędów jako danych w formacie Collection+Json ..... 182Zasoby wyszukiwania ............................................................................................................ 184

Funkcjonalność: tworzenie zgłoszenia błędu 186Funkcjonalność: uaktualnianie zgłoszenia błędu 188

Uaktualnianie zgłoszenia błędu ........................................................................................... 188Uaktualnianie nieistniejącego zgłoszenia błędu ................................................................ 190

Funkcjonalność: usuwanie zgłoszenia błędu 191Usuwanie zgłoszenia błędu ................................................................................................... 191Usuwanie nieistniejącego zgłoszenia błędu ........................................................................ 192

Funkcjonalność: przetwarzanie zgłoszenia błędu 193Testy ......................................................................................................................................... 193Implementacja ........................................................................................................................ 194

Podsumowanie 195

Rozdział 8. Usprawnianie API ..............................................................................................197Kryteria akceptacji dla nowych funkcjonalności 197Implementacja obsługi buforowania danych wyjściowych 198Dodanie testów do sprawdzenia buforowania danych wyjściowych 200Implementacja ponownego pobierania buforowanych danych 202Implementacja warunkowych żądań GET

do obsługi ponownego pobierania buforowanych danych 203Wykrywanie konfliktów 206Implementacja wykrywania konfliktów 206Audyt zmiany 209Implementacja audytu zmian za pomocą uwierzytelniania Hawk 210Monitorowanie 213Implementacja monitorowania 214Podsumowanie 216

Rozdział 9. Tworzenie klienta ..............................................................................................217Biblioteki klienta 218

Biblioteki opakowujące ......................................................................................................... 218Łącza jako funkcje .................................................................................................................. 222

Przebieg działania aplikacji 227Warto wiedzieć ....................................................................................................................... 228

Poleć książkęKup książkę

Page 8: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

8 Spis treści

Klienty z misją ......................................................................................................................... 232Stan klienta .............................................................................................................................. 234

Podsumowanie 235

Rozdział 10. Model programowania HTTP ........................................................................... 237Komunikaty 238Nagłówki 242Zawartość komunikatu 247

Wykorzystanie zawartości komunikatu .............................................................................. 248Tworzenie zawartości komunikatu ...................................................................................... 250

Podsumowanie 257

Rozdział 11. Hosting .......................................................................................................... 259Hosting WWW 260

Infrastruktura ASP.NET ........................................................................................................ 260Routing ASP.NET ................................................................................................................... 262Routing Web API ................................................................................................................... 264Konfiguracja globalna ............................................................................................................ 266Procedura obsługi Web API ASP.NET ............................................................................... 268

Samohostowanie 270Architektura WCF .................................................................................................................. 271Klasa HttpSelfHostServer ...................................................................................................... 272Klasa SelfHostConfiguration ................................................................................................ 273Rezerwacja adresu URL i kontrola dostępu ........................................................................ 275

Hosting Web API z użyciem OWIN i Katana 275OWIN ....................................................................................................................................... 276Projekt Katana ......................................................................................................................... 277Konfiguracja Web API ........................................................................................................... 280Oprogramowanie pośredniczące Web API ........................................................................ 281Środowisko OWIN ................................................................................................................. 283

Hosting w pamięci 284Hosting Azure Service Bus 284Podsumowanie 290

Rozdział 12. Kontrolery i routing ........................................................................................ 291Ogólny opis przepływu komunikatów HTTP 291Potok procedur obsługi komunikatów 292

Dyspozytor .............................................................................................................................. 296HttpControllerDispatcher ..................................................................................................... 297Wybór kontrolera ................................................................................................................... 297Aktywacja kontrolera ............................................................................................................. 301

Poleć książkęKup książkę

Page 9: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Spis treści 9

Potok kontrolera 302ApiController ......................................................................................................................... 302Model przetwarzania ApiController ................................................................................... 302

Podsumowanie 314

Rozdział 13. Formatery i dołączanie modelu ........................................................................315Waga modeli w ASP.NET Web API 315Jak działa dołączanie modelu? 316Wbudowane bindery modelu 319

Implementacja ModelBindingParameterBinder ............................................................... 320Dostawcy wartości ................................................................................................................. 320Bindery modelu ...................................................................................................................... 323Dołączanie modelu tylko dla adresu URI ........................................................................... 325Implementacja FormatterParameterBinder ....................................................................... 326Domyślny wybór HttpParameterBinding .......................................................................... 331

Sprawdzanie poprawności modelu 331Zastosowanie w modelu atrybutów adnotacji danych ...................................................... 331Przeglądanie wyników operacji sprawdzania poprawności ............................................. 332

Podsumowanie 334

Rozdział 14. HttpClient .......................................................................................................335Klasa HttpClient 335

Cykl życiowy ........................................................................................................................... 335Opakowanie ............................................................................................................................ 336Wiele egzemplarzy ................................................................................................................. 336Bezpieczeństwo wątków ........................................................................................................ 337Metody pomocnicze .............................................................................................................. 337Zagłębiamy się w kolejne warstwy ....................................................................................... 337Ukończone żądania nie zgłaszają wyjątków ....................................................................... 338Zawartość jest wszystkim ...................................................................................................... 338Przerwanie na żądanie ........................................................................................................... 339Metoda SendAsync() ............................................................................................................. 340

Procedury obsługi komunikatów klienta 341Proxy dla procedur obsługi ................................................................................................... 342Nieprawdziwe procedury obsługi odpowiedzi ................................................................... 343Tworzenie wielokrotnego użytku procedur obsługi odpowiedzi .................................... 344

Podsumowanie 346

Rozdział 15. Bezpieczeństwo ...............................................................................................347Zapewnienie bezpieczeństwa transportu 347Użycie TLS w ASP.NET Web API 349

Użycie TLS z hostingiem IIS ................................................................................................. 349Użycie TLS z samohostowaniem ......................................................................................... 351

Poleć książkęKup książkę

Page 10: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

10 Spis treści

Uwierzytelnianie 351Model oświadczeń .................................................................................................................. 352Pobieranie i przypisywanie aktualnego zleceniodawcy ..................................................... 356Uwierzytelnienie oparte na transporcie .............................................................................. 357Uwierzytelnienie serwera ...................................................................................................... 357Uwierzytelnienie klienta ........................................................................................................ 361Framework uwierzytelniania HTTP .................................................................................... 367Implementacja uwierzytelniania opartego na HTTP ........................................................ 369Katana, czyli oprogramowanie pośredniczące do uwierzytelniania ................................ 370Aktywne i pasywne oprogramowanie pośredniczące

odpowiedzialne za uwierzytelnianie .................................................................................. 374Filtry uwierzytelniania w Web API ...................................................................................... 375Uwierzytelnianie oparte na tokenie ..................................................................................... 378Schemat uwierzytelniania Hawk .......................................................................................... 385

Autoryzacja 386Egzekwowanie autoryzacji .................................................................................................... 388Współdzielenie zasobów między serwerami w różnych domenach ................................ 391Obsługa mechanizmu CORS na platformie ASP.NET Web API .................................... 393

Podsumowanie 396

Rozdział 16. OAuth 2.0, czyli framework uwierzytelniania ................................................... 397Aplikacje klienta 399Uzyskanie dostępu do chronionych zasobów 401Pobranie tokenu dostępu 402Uprawnienia kodu autoryzacji 404Zakres 406Kanał oficjalny kontra kanał nieoficjalny 407Token refresh 409Serwer zasobów i serwer autoryzacji 410Przetwarzanie tokenów dostępu w ASP.NET Web API 411OAuth 2.0 i uwierzytelnianie 413Autoryzacja na podstawie zakresu 416Podsumowanie 417

Rozdział 17. Testowanie .................................................................................................... 419Testy jednostkowe 419

Frameworki testów jednostkowych ..................................................................................... 420Rozpoczęcie pracy z testami jednostkowymi w Visual Studio ......................................... 420xUnit.NET ............................................................................................................................... 422Rola testów jednostkowych w programowaniu TDD ....................................................... 423

Poleć książkęKup książkę

Page 11: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Spis treści 11

Testy jednostkowe implementacji ASP.NET Web API 427Testy jednostkowe ApiController ........................................................................................ 427Testy jednostkowe MediaTypeFormatter ........................................................................... 433Testy jednostkowe HttpMessageHandler ........................................................................... 436Testy jednostkowe ActionFilterAttribute ........................................................................... 437

Testy jednostkowe tras 440Testy integracji w ASP.NET Web API 442Podsumowanie 443

Dodatek A. Typy danych ......................................................................................................445

Dodatek B. Nagłówki HTTP ..................................................................................................447

Dodatek C. Negocjacja treści ................................................................................................451Negocjacja proaktywna 451Negocjacja reaktywna 452

Dodatek D. Buforowanie w działaniu ...................................................................................455

Dodatek E. Przepływ zdarzeń podczas uwierzytelniania .......................................................459

Dodatek F. Specyfikacja typu danych dla application/issue+json ..........................................463Konwencje nazw 463Dokument zgłoszenia błędu 463Kwestie bezpieczeństwa 464Kwestie interoperacyjności 464Kwestie związane z IANA 464

Dodatek G. Certyfikaty i kryptografia klucza publicznego .....................................................465Cofnięcie certyfikatu 471Tworzenie testowych kluczy i certyfikatów 471

Skorowidz ...............................................................................................................475

Poleć książkęKup książkę

Page 12: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

12 Spis treści

Poleć książkęKup książkę

Page 13: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

67

ROZDZIAŁ 3.

Podstawy ASP.NET Web API

Łatwiej wyznaczyć kurs, gdy masz pod ręką mapę.

Skoro dostarczyliśmy kontekst i wyjaśniliśmy, dlaczego Web API ma tak duże znaczenie dla no-woczesnych aplikacji sieciowych, w tym rozdziale przejdziemy do pracy z ASP.NET Web API.Platforma ASP.NET Web API i nowy model programowania HTTP oferują różne możliwości w za-kresie zarówno budowy, jak i wykorzystywania Web API. Na początku przedstawimy pewne najważ-niejsze cele Web API i sposoby umożliwiające ich osiągnięcie. Następnie, analizując model pro-gramistyczny, przekonasz się, jak te możliwości są udostępniane dla Twojego kodu w ASP.NETWeb API. Czy może być tutaj lepszy sposób niż przeanalizowanie kodu dostarczanego przez szablonprojektu Web API w Visual Studio? Na koniec wykroczymy poza domyślny kod szablonu i przy-gotujemy nasze pierwsze Web API typu „Witaj, świecie!”.

Najczęściej spotykane scenariuszeASP.NET Web API, w przeciwieństwie do wielu technologii, ma doskonale udokumentowaną i do-stępną historię (fragment znajdziesz w serwisie CodePlex1). Już na samym początku zespół odpowie-dzialny za rozwój platformy podjął decyzję o zachowaniu maksymalnej możliwej przejrzystości,aby wpływ na powstawanie produktu mogła mieć społeczność ekspertów, którzy ostatecznie będąkorzystać z tego produktu do budowy rzeczywistych systemów. Oto podstawowe cele, których speł-nienie stało za utworzeniem ASP.NET:

Pierwsza klasa programowania HTTP.

Jednakowe możliwości podczas programowania po stronie klienta i serwera.

Elastyczna obsługa różnych formatów.

Nigdy więcej „tworzenia kodu z nawiasami ostrymi”.

Możliwość stosowania testów jednostkowych.

Wiele opcji w zakresie hostingu.

1 http://wcf.codeplex.com/

Poleć książkęKup książkę

Page 14: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

68 Rozdział 3. Podstawy ASP.NET Web API

To tylko najważniejsze cele, a więc nie jest to pełna lista wszystkich możliwości, jakie oferuje fra-mework. ASP.NET Web API pozwala uzyskać najlepsze połączenie różnych technologii: WCF (win-dows communication foundation) z jego nieskończenie elastyczną architekturą, obsługą klienta i ela-stycznym modelem hostingu oraz ASP.NET MVC z oferowaną przez tę platformę obsługą konwencjizamiast konfiguracji, poprawionymi możliwościami w zakresie przeprowadzania testów i funk-cjami zaawansowanymi, takimi jak dołączanie modelu i weryfikacja. Jak się przekonasz podczaslektury niniejszego rozdziału, w wyniku tego połączenia powstał framework, z którym łatwo roz-począć pracę i który można bez problemu dostosować do własnych potrzeb w miarę ich ewolucji.

Pierwsza klasa programowania HTTPKiedy budujesz nowoczesne Web API — zwłaszcza przeznaczone dla prostszych klientów, takichjak urządzenia mobilne — sukces tego API jest bardzo często powiązany z jego ekspresyjnością.Z kolei ekspresyjność Web API zależy od tego, jak dobrze radzi sobie z użyciem HTTP jako proto-kołu aplikacji. Wykorzystanie HTTP w charakterze protokołu aplikacji wykracza poza prostą obsługężądań HTTP i generowanie odpowiedzi HTTP. Oznacza, że zachowanie zarówno aplikacji, jak i sto-jącego za nią frameworku jest nadzorowane przez kontrolę przepływu zdarzeń w HTTP i elementydanych, a nie przez pewne dane dodatkowe, które są jedynie (i przypadkowo) przekazywane za po-mocą HTTP. Spójrz na przykład na poniższe żądanie SOAP użyte do komunikacji z usługą WCF:

POST http://localhost/GreetingService.svc HTTP/1.1Content-Type: text/xml; charset=utf-8SOAPAction: "HelloWorld"Content-Length: 154

<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <HelloWorld xmlns="http://localhost/wcf/greeting"/> </s:Body></s:Envelope>

W powyższym przykładzie klient wykonuje żądanie do serwera w celu otrzymania przyjaznegokomunikatu powitalnego. Jak widzisz, żądanie zostało wysłane za pomocą HTTP. Jednak w tymmiejscu tak naprawdę kończy się powiązanie z protokołem HTTP. Zamiast wykorzystać metodyHTTP (czasami określane mianem verbs) do przedstawienia natury akcji żądanej usługi, przyjętetutaj podejście polega na wysyłaniu wszystkich żądań za pomocą tej samej metody HTTP POST i umiesz-czeniu szczegółów charakterystycznych dla aplikacji zarówno w zawartości żądania HTTP, jaki w niestandardowym nagłówku SOAPAction. Jak zapewne się spodziewasz, ten sam wzorzec zostałpowtórzony w odpowiedzi wygenerowanej przez tę usługę:

HTTP/1.1 200 OKContent-Length: 984Content-Type: text/xml; charset=utf-8Date: Tue, 26 Apr 2011 01:22:53 GMT<s:Envelope xmlns:s="http://schemas.xmlsoap.org/soap/envelope/"> <s:Body> <HelloWorldResponse xmlns="http://localhost/wcf/greeting"> ... </HelloWorldResponse> </s:Body></s:Envelope>

Poleć książkęKup książkę

Page 15: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Najczęściej spotykane scenariusze 69

Podobnie jak w przypadku komunikatu żądania, elementy protokołu użyte do kontrolowaniaaplikacji — to znaczy określenia sposobu, w jaki aplikacje klienta i serwer mogą się wzajemnie ro-zumieć — zostały wyodrębnione z elementów HTTP i umieszczone w znacznikach XML częścigłównej odpowiednio żądania i odpowiedzi.

W tego rodzaju podejściu HTTP nie jest używany do wyrażenia protokołu aplikacji, ale raczej poprostu jako sposób transportu dla innego protokołu aplikacji — tutaj SOAP. Wprawdzie takierozwiązanie może być dobre w sytuacji, gdzie pojedyncza usługa musi się komunikować z podobny-mi klientami za pomocą wielu różnych protokołów, to jednak stanie się problematyczne, gdy zaj-dzie potrzeba komunikacji z wieloma różnymi klientami za pomocą pojedynczego protokołu. Pro-blemy te są doskonale zilustrowane w przypadku Web API, gdzie różnorodność nie dotyczy jedynieklientów, ale także infrastruktury komunikacyjnej między klientami i usługami (na przykład in-ternet), a ponadto ta różnorodność jest ogromna i ciągle się zmienia. W takim świecie należy dążyćdo optymalizacji klientów i usług nie pod względem niezależności od protokołu, lecz raczej dozapewnienia pierwszorzędnego wrażenia dotyczącego najczęściej stosowanego protokołu aplikacji.W przypadku aplikacji komunikujących się przez sieć tym protokołem jest HTTP.

Można powiedzieć, że ASP.NET Web API zbudowano na podstawie niewielkiego zbioru prostychobiektów HTTP. Dwa najważniejsze z nich to HttpRequestMessage i HttpResponseMessage. Przezna-czeniem tych obiektów jest dostarczenie silnie typowanego widoku rzeczywistego komunikatuHTTP. Spójrz na przedstawiony poniżej komunikat żądania HTTP:

GET http://localhost:50650/api/greeting HTTP/1.1Host: localhost:50650accept: application/jsonif-none-match: "1"

Przyjmując założenie, że pokazane żądanie zostało otrzymane przez usługę ASP.NET Web API,możemy uzyskać dostęp do różnych elementów żądania i operować nimi za pomocą przedsta-wionego poniżej kodu w klasie kontrolera Web API:

var request = this.Request;var requestedUri = request.RequestUri;var requestedHost = request.Headers.Host;var acceptHeaders = request.Headers.Accept;var conditionalValue = request.Headers.IfNoneMatch;

Ten silnie typowany model przedstawia poprawny poziom abstrakcji poprzez HTTP, pozwalaprogramiście na bezpośrednią pracę z żądaniem lub odpowiedzią HTTP i jednocześnie odciąża good konieczności zajmowania się niskiego poziomu kwestiami, takimi jak analiza nieprzetworzonegokomunikatu lub jego generowanie.

Jednakowe możliwości podczas programowania po stronie klienta i serweraJednym z najbardziej kuszących aspektów związanych ze zbudowaniem ASP.NET Web API napodstawie biblioteki opartej na HTTP jest to, że biblioteka ta może być używana nie tylko przezserwer, ale również w aplikacjach klienta utworzonych z wykorzystaniem platformy .NET. Tooznacza, że przedstawione wcześniej żądanie HTTP można utworzyć za pomocą tych samych klasmodelu programowania HTTP, które ostatecznie będą używane do pracy z żądaniem wewnątrzWeb API, co pokażemy w dalszej części rozdziału.

Poleć książkęKup książkę

Page 16: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

70 Rozdział 3. Podstawy ASP.NET Web API

Jak się przekonasz w rozdziale 10., model programowania HTTP to znacznie więcej niż operowanieróżnymi elementami danych w żądaniach i odpowiedziach. Funkcje takie jak procedury obsługikomunikatów i negocjacja treści zostały bezpośrednio wbudowane w model programowania HTTP.To umożliwia programistom wykorzystanie ich po stronie zarówno serwera, jak i klienta w celuopracowania zaawansowanych interakcji klient – serwer przy jednoczesnej maksymalizacji wielo-krotnego użycia tego samego kodu.

Elastyczna obsługa różnych formatówSzczegółowe omówienie negocjacji treści znajdziesz w rozdziale 13. W tym miejscu powinieneświedzieć, że na wysokim poziomie to jest proces, w którym klient i serwer współpracują ze sobąw celu określenia odpowiedniego formatu, który będzie używany podczas wymiany reprezentacjiprzez HTTP. Istnieje kilka różnych podejść i technik stosowanych podczas negocjacji treści. Do-myślnie ASP.NET Web API obsługuje podejście oparte na serwerze, używając nagłówka HTTPAccept, aby pozwolić klientowi na wybór między formatami XML i JSON. W przypadku brakunagłówka Accept ASP.NET Web API będzie domyślnie zwracać dane w formacie JSON (podobniejak wiele innych aspektów frameworku, także to zachowanie domyślne można zmienić).

Na przykład spójrz na poniższe żądanie do usługi ASP.NET Web API:GET http://localhost:50650/api/greeting HTTP/1.1

Ponieważ żądanie to nie zawiera nagłówka Accept wskazującego serwerowi preferowany formatdanych, serwer zwróci dane w formacie JSON. To zachowanie można zmienić przez umieszczeniew żądaniu nagłówka Accept i wskazanie, że preferowany typ danych to XML2:

GET http://localhost:50650/api/greeting HTTP/1.1accept: application/xml

Nigdy więcej „tworzenia kodu z nawiasami ostrymi”Wraz z dojrzewaniem frameworku .NET jedno z najczęściej powtarzających się zastrzeżeń ze stronyprogramistów dotyczyło ilości kodu konfiguracyjnego XML koniecznego do stworzenia wydawało-by się prostych lub nawet domyślnych scenariuszy. Co gorsza, ponieważ konfiguracja kontrolo-wała aspekty takie jak typy wczytywane podczas uruchamiania aplikacji, zmiana konfiguracji mogłaprowadzić do błędów w systemie niewychwytywanych przez kompilator, a ujawniających się do-piero po uruchomieniu aplikacji. Jeden z największych przykładów takich narzekań wiąże się z po-przednikiem ASP.NET Web API, czyli WCF. Wprawdzie w samym WCF znacznie poprawionokwestię konfiguracji i ilości wymaganego przez nią kodu, ale zespół odpowiedzialny za rozwójASP.NET Web API poszedł w zupełnie innym kierunku i wprowadził tryb konfiguracji całkowicieoparty na kodzie. Szczegółowe omówienie konfiguracji ASP.NET Web API znajdziesz w rozdziale 11.

2 Utrzymywany przez IANA katalog publicznych typów danych znajdziesz tutaj: http://www.iana.org/assignments/

media-types/media-types.xhtml.

Poleć książkęKup książkę

Page 17: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Najczęściej spotykane scenariusze 71

Możliwość stosowania testów jednostkowychWraz z coraz większą popularnością technik takich jak TDD (test-driven development) i BDD(behavior-driven development) nastąpił także proporcjonalny wzrost frustracji związanej z faktem,że wiele popularnych usług i frameworków sieciowych nadal używa statycznych obiektów kontekstu,zamkniętych typów i obszernych drzew dziedziczenia. Te techniki znacznie utrudniają przepro-wadzanie testów jednostkowych we wspomnianych obiektach, ponieważ trudno jest je utworzyći zainicjalizować poza środowiskiem uruchomieniowym. Na dodatek bardzo trudno jest je zastąpić„imitacjami”, które mogłyby zapewnić lepszą izolację testu.

Na przykład ASP.NET bardzo mocno opiera się na obiekcie HttpContext, podczas gdy w przypad-ku WCF podstawą jest obiekt OperationContext (lub WebOperationContext, w zależności od rodzajuusługi). Podstawowy problem ze statycznymi obiektami kontekstu takimi jak wymienione polegana tym, że są one definiowane i używane przez środowisko uruchomieniowe frameworku. Dlategoteż przetestowanie usługi opracowanej z użyciem tych obiektów kontekstu w rzeczywistości wy-maga uruchomienia hosta usługi i udostępnienia tej usługi. Wprawdzie tego rodzaju techniki sąogólnie rzecz biorąc akceptowane podczas testów integracji, ale okazują się nieodpowiednie dostylu programowania takiego jak TDD, który opiera się na możliwości szybkiego wykonywaniamałych testów jednostkowych.

Jednym z celów w ASP.NET Web API jest znaczna poprawa obsługi wspomnianych powyżej stylówprogramowania. Mamy dwie cechy charakterystyczne frameworku pomagające w osiągnięciu tegocelu. Pierwsza: ASP.NET Web API stosuje ten sam model programowania jak w przypadku frame-worku MVC. Tym samym dostępne od kilku lat możliwości w zakresie przeprowadzania testówstają się dostępne także w ASP.NET Web API. Programiści mogą więc uniknąć konieczności użyciastatycznych obiektów kontekstu i opakowań, aby egzemplarze „imitacji” mogły być wykorzystywanew testach jednostkowych.

Druga: pamiętaj o zbudowaniu ASP.NET Web API na podstawie modelu programowania HTTP.W tego rodzaju modelu obiekty są prostymi strukturami danych, które mogą być tworzone, kon-figurowane, przekazywane metodzie akcji jako parametr i analizowane po ich otrzymaniu w od-powiedzi. Zyskujemy więc możliwość opracowywania testów jednostkowych w jasny i konkretnysposób. Wraz z ewolucją ASP.NET Web API testowanie stało się ważnym obszarem zaintereso-wania twórców frameworku, co znajduje odzwierciedlenie w klasie HttpRequestContext w WebAPI 2. Dokładne omówienie tematu testowania znajdziesz w rozdziale 17.

Wiele opcji w zakresie hostinguPomimo ogólnie mniejszych możliwości jednym z największych atrybutów WCF była możliwość„samohostowania”, czyli uruchomienia w dowolnym procesie, na przykład w usłudze Windows,aplikacji działającej w konsoli lub w serwerze IIS (internet information services). Tak naprawdę taogromna elastyczność w zakresie hostingu powodowała, że ograniczenia w zakresie testów jednost-kowych były do zniesienia… prawie.

Podczas konsolidacji WCF Web API z ASP.NET w celu utworzenia ASP.NET Web API zespółodpowiedzialny za platformę chciał zachować ową możliwość samohostowania. Dlatego usługiASP.NET Web API, podobnie jak usługi WCF, mogą być uruchamiane w dowolnym procesie.Tematem hostingu zajmiemy się w rozdziale 11.

Poleć książkęKup książkę

Page 18: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

72 Rozdział 3. Podstawy ASP.NET Web API

Rozpoczęcie pracy z ASP.NET Web APIPo omówieniu celów kryjących się za opracowaniem ASP.NET Web API możemy przystąpić dozapoznawania się z wybranymi elementami, z którymi będziemy pracować podczas tworzeniawłasnych Web API. Jedno z najprostszych podejść polega na utworzeniu zupełnie nowego pro-jektu ASP.NET Web API i przeanalizowaniu kodu dostarczanego przez szablon projektu. Abyutworzyć nowy projekt ASP.NET Web API, po uruchomieniu Visual Studio przejdź do kategoriiVisual C#/Sieć Web w oknie dialogowym Nowy projekt, a następnie wybierz Aplikacja sieci Webplatformy ASP.NET (rysunek 3.1).

Rysunek 3.1. Projekt aplikacji ASP.NET MVC w oknie dialogowym Nowy projekt wyświetlonym w VisualStudio 2015

Po kliknięciu przycisku OK zostanie wyświetlone kolejne okno dialogowe, w którym będzie możnawybrać odpowiednią konfigurację projektu. W omawianym przykładzie wybierz utworzenie pro-jektu Web API (rysunek 3.2).

Zwróć uwagę na fakt, że Web API to po prostu odmiana szablonu projektu z rodziny projektówASP.NET. Oznacza to, że projekty Web API współdzielą te same podstawowe komponenty, jakw przypadku innych typów projektów sieciowych. Różnica polega jedynie na plikach generowanychprzez szablon w chwili tworzenia projektu początkowego. Dlatego jest zarówno prawidłowe, jaki możliwe dołączanie Web API w innym dowolnym szablonie pokazanym na rysunku 3.2.

Poleć książkęKup książkę

Page 19: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Rozpoczęcie pracy z ASP.NET Web API 73

Rysunek 3.2. Wybór Web API jako typu dla tworzonej aplikacji ASP.NET MVC

Tak naprawdę ASP.NET Web API to po prostu zbiór klas utworzonych na podstawie kompo-nentów frameworku Web API i hostowanych przez proces, w którym znajduje się środowiskouruchomieniowe ASP.NET. To może być ustawienie domyślne lub wskazany przez programistęniestandardowy host (do tego tematu jeszcze powrócimy w dalszej części rozdziału). Web API moż-na więc dołączyć do dowolnego typu projektu, niezależnie od tego, czy to będzie projekt MVC,aplikacja działająca w konsoli czy nawet klasa biblioteki, do której odwołania będą pochodzić z wieluinnych projektów.

Komponenty frameworku ASP.NET są dostępne dla projektów Web API za pomocą aplikacji prze-znaczonej do zarządzania pakietami NuGet3. Pakiety NuGet wymienione w tabeli 3.1 są instalo-wane w domyślnym szablonie projektu. Jeżeli obsługę Web API chcesz dodać do innego projektu,musisz się po prostu upewnić, czy zainstalowałeś pakiety, które dostarczają wymaganą funkcjo-nalność.

3 http://docs.nuget.org/

Poleć książkęKup książkę

Page 20: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

74 Rozdział 3. Podstawy ASP.NET Web API

Tabela 3.1. Pakiety NuGet dla ASP.NET Web API

Nazwa pakietu Identyfikator pakietu4 Opis Zale no ci pakietu5

Biblioteki klienta HTTPna platformie Microsoft.NET Framework 4

Microsoft.Net.Http Zapewnia podstawowy modelprogramowania HTTP, czniez obs ug obiektów HttpRequestMessage i HttpResponsemessage.

brak

Microsoft ASP.NETWeb API

Microsoft.AspNet.WebApi

Metapakiet6 NuGet zapewniapojedyncze odwo anie do instalacjiwszystkiego, co jest potrzebnedo tworzenia i hostingu Web APIw ASP.NET.

Microsoft.AspNet.WebApi.WebHost

Biblioteki klientaMicrosoft ASP.NETWeb API

Microsoft.AspNet.WebApi.Client

Zawiera rozszerzenia dlapodstawowych bibliotek klientaHTTP w NET Framework 4.Rozszerzenia te dostarczaj obs ugfunkcji takich jak formatowanieXML i JSON, a tak e mo liwoprzeprowadzania negocjacji tre ci.

Microsoft.Net.HttpNewtonsoft.Json7

Biblioteki podstawoweMicrosoft ASP.NETWeb API

Microsoft.AspNet.WebApi.Core

Zawiera podstawowy modelprogramowania Web APIi komponenty rodowiskauruchomieniowego, mi dzy innymikluczow klas ApiController.

Microsoft.AspNet.WebApi.Client

Microsoft ASP.NETWeb API Web Host

Microsoft.AspNet.WebApi.WebHost

Zawiera wszystkie komponentyrodowiska uruchomieniowego

niezb dne do hostingu Web APIw trakcie dzia ania aplikacji ASP.NET.

Microsoft.Web.Infrastructure

Microsoft.AspNet.WebApi.Core

Poza pakietami NuGet instalowanymi jako część domyślnych szablonów projektów dostępne sąjeszcze inne pakiety NuGet, wymienione w tabeli 3.2.

Tabela 3.2. Dodatkowe pakiety NuGet dostępne dla ASP.NET Web API

Nazwa pakietu Identyfikator pakietu Opis Zale no pakietu

SamohostowanieMicrosoft ASP.NETWeb API

Microsoft.AspNet.WebApi.SelfHost

Zawiera wszystkie komponentyrodowiska uruchomieniowego

niezb dne do hostingu Web APIw procesie klienta (na przyk adaplikacji konsoli).

Microsoft.AspNet.WebApi.Core

Microsoft ASP.NETWeb API OWIN

Microsoft.AspNet.WebApi.Owin

Umo liwia hosting ASP.NETWeb API w obr bie serweraOWIN i dost p do dodatkowychelementów serwera OWIN.

Microsoft.AspNet.WebApi.Core,

Microsoft.Owin, Owin

4 Identyfikator pakietu można wykorzystać do uzyskania dokładniejszych informacji o danym pakiecie. W tym celu

identyfikator należy dołączyć do adresu URL.5 Zależność pakietu NuGet oznacza, że podczas instalacji danego pakietu menedżer NuGet w pierwszej kolejności pró-

buje zainstalować wszystkie pakiety, na których opiera się działanie danego pakietu.6 Metapakiet NuGet to pakiet pozbawiony rzeczywistej zawartości i mający jedynie zależności względem innych pakietów NuGet.7 Wprawdzie używany w ASP.NET Web API, ale NewtonsoftJson to zewnętrzny komponent, który można pobrać bez-

płatnie (http://www.nuget.org/packages/newtonsoft.json).

Poleć książkęKup książkę

Page 21: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Nowy projekt Web API 75

Przedstawienie zbioru pakietów NuGet w postaci graficznej może pomóc w jeszcze łatwiejszymustaleniu, które pakiety należy zainstalować w projekcie w zależności od jego celów. Przykładznajdziesz na rysunku 3.3.

Rysunek 3.3. Hierarchia pakietów NuGet dla Web API

Jak widać na rysunku 3.3, instalacja dowolnego z tych pakietów NuGet automatycznie spowodujeinstalację wszystkich bezpośrednio lub pośrednio powiązanych z nim pakietów. Na przykładMicrosoft.AspNet.WebApi spowoduje instalację pakietów Microsoft.AspNet.WebApi.WebHost, Microsoft.AspNet.WebApi.Core, Microsoft.Web.Infrastructure, Microsoft.AspNet.WebApi.Client, Newtonsoft.Json

i Microsoft.Net.Http.

Nowy projekt Web APIPo utworzeniu nowego projektu ASP.NET Web API warto przeanalizować kluczowe kompo-nenty wygenerowane przez szablon projektu, które później dostosujemy do własnych potrzeb w celuutworzenia Web API. Skoncentrujemy się tutaj na dwóch ważnych plikach: WebApiConfig.csi ValuesController.cs (rysunek 3.4).

Poleć książkęKup książkę

Page 22: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

76 Rozdział 3. Podstawy ASP.NET Web API

Rysunek 3.4. Pliki WebApiConfig.cs i ValuesController.cs zaznaczone w oknie Eksploratora rozwiązaniaw Visual Studio 2015

Plik WebApiConfig.csPlik C# lub Visual Basic.NET znajduje się w katalogu App_Start i deklaruje klasę WebApiConfig. Taklasa zawiera pojedynczą metodę o nazwie Register() i jest wywoływana przez kod metodyApplication_Start() w pliku global.asax. Jak sama nazwa wskazuje, klasa jest odpowiedzialna zarejestrację różnych aspektów konfiguracji Web API. Domyślnie podstawowy kod konfiguracyjnywygenerowany przez szablon projektu powoduje zarejestrowanie domyślnej trasy Web API. Trasata jest używana do mapowania przychodzących żądań HTTP na klasy kontrolerów, a także do prze-twarzania elementów danych, które mogą być wysyłane jako część adresów URL i udostępnianeinnym klasom w potoku przetwarzania. Kod domyślnej klasy WebApiConfig przedstawiliśmy w li-stingu 3.1.

Listing 3.1. Kod domyślnej klasy WebApiConfigpublic static class WebApiConfig{ public static void Register(HttpConfiguration config) { // Konfiguracja i us ugi sk adnika Web API // Skonfiguruj sk adnik Web API, aby korzysta tylko z uwierzytelniania za pomoc tokenów bearer config.SuppressDefaultHostAuthentication(); config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));

// Trasy sk adnika Web API config.MapHttpAttributeRoutes();

Poleć książkęKup książkę

Page 23: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Nowy projekt Web API 77

config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional } ); }}

Jeżeli programowanie w stylu MVC nie jest Ci obce, wówczas możesz dostrzec, że ASP.NET WebAPI oferuje odmienny zbiór metod rozszerzających do zarejestrowania swoich tras innych niż do-myślne trasy MVC. Na przykład ten sam nowy projekt zawierający klasę WebApiConfig zawiera takżeklasę RouteConfig, której kod przedstawia się następująco:

public class RouteConfig{ public static void RegisterRoutes(RouteCollection routes) {

routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

routes.MapRoute( name: "Default", url: "{controller}/{action}/{id}", defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } ); }}

Istnienie dwóch metod przeznaczonych do konfiguracji tras może się na początku wydawać nie-potrzebne i dlatego też warto omówić występujące między nimi różnice na wysokim poziomie.Trzeba pamiętać, że te metody „mapujące” to po prostu metody rozszerzające odpowiedzialne zautworzenie egzemplarza trasy i jego dodanie do kolekcji tras powiązanej z hostem. Różnica międzytymi metodami i zarazem powód istnienia obu sprowadza się do faktu, że ASP.NET MVC i ASP.NETWeb API używają zupełnie różnych klas tras, a nawet typów kolekcji tras. Szczegóły dotyczącewspomnianych typów omówimy bardzo dokładnie w rozdziale 11. Powodem zastosowania innegotypu tras niż w ASP.NET MVC było umożliwienie ASP.NET Web API odcięcie się od starego koduznajdującego się w klasach Route i RouteCollection w podzespole System.Web, a tym samym za-pewnienie znacznie większej elastyczności pod względem opcji dotyczących hostingu. Pośredniąkorzyścią wynikającą z tej decyzji projektowej jest dostarczenie ASP.NET Web API możliwościsamohostowania.

Konfiguracja routingu ASP.NET Web API wymaga zadeklarowania egzemplarzy HttpRoute i do-dania ich do kolekcji tras. Pomimo tworzenia egzemplarzy HttpRoute za pomocą innej metodyrozszerzającej niż w przypadku ASP.NET MVC semantyka pozostała praktycznie identyczna, międzyinnymi w zakresie elementów takich jak nazwa trasy, szablon trasy, parametry domyślne, a nawetograniczenia trasy. Jak możesz zobaczyć w listingu 3.1, wygenerowany przez szablon projektu kodkonfiguracyjny tras definiuje trasę domyślną dla API zawierającą prefiks api w adresie URI, nazwękontrolera i opcjonalny parametr w postaci identyfikatora. Bez konieczności wprowadzania jakich-kolwiek modyfikacji ta deklaracja trasy zwykle okazuje się wystarczająca do tworzenia API po-zwalającego na pobieranie, uaktualnianie i usuwanie danych. Taka możliwość wynika ze sposobu,w jaki klasa kontrolera ASP.NET Web API mapuje metody HTTP na metody akcji kontrolera.Mapowaniem metod HTTP zajmiemy się dokładniej w dalszej części rozdziału, natomiast szcze-gółowe omówienie tego tematu znajdziesz w rozdziale 12.

Poleć książkęKup książkę

Page 24: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

78 Rozdział 3. Podstawy ASP.NET Web API

Plik ValuesController.csKlasa ApiController będąca klasą nadrzędną dla klasy ValuesController jest sercem ASP.NETWeb API. Wprawdzie można utworzyć prawidłowy kontroler ASP.NET Web API przez imple-mentację różnych elementów składowych interfejsu IHttpController, ale w praktyce większość kon-trolerów ASP.NET Web API powstaje na podstawie klasy ApiController. Ta klasa odgrywa ważnąrolę podczas koordynacji pozostałych klas w modelu obiektowym ASP.NET Web API w celuprzeprowadzania kilku kluczowych zadań podczas przetwarzania żądania HTTP:

wybór i uruchomienie metody akcji w klasie kontrolera;

konwersja elementów komunikatu żądania HTTP na parametry w metodzie akcji kontrolerai konwersja wartości metody akcji kontrolera na prawidłową część główną odpowiedzi HTTP;

wykonanie różnego rodzaju filtrów skonfigurowanych dla metody akcji, kontrolera lub glo-balnie;

udostępnienie odpowiedniego stanu kontekstu metodom akcji klasy kontrolera.

Oparcie na klasie bazowej ApiController i wykorzystanie zalet kluczowych zadań przetwarzaniażądania powoduje, że klasa ValuesController dołączona do szablonu Web API stanowi wysokiegopoziomu abstrakcję zbudowaną na podstawie ApiController. W listingu 3.2 przedstawiliśmy koddomyślnej klasy ValuesController.

Listing 3.2. Kod domyślnej klasy ValuesControllerpublic class ValuesController : ApiController{ // GET api/values public IEnumerable<string> Get() { return new string[] { "value1", "value2" }; }

// GET api/values/5 public string Get(int id) { return "value"; }

// POST api/values public void Post([FromBody]string value) { }

// PUT api/values/5 public void Put(int id, [FromBody]string value) { }

// DELETE api/values/5 public void Delete(int id) { }}

Poleć książkęKup książkę

Page 25: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

„Witaj, Web API!” 79

Klasa ValuesController choć prosta, to jednak okazuje się niezwykle użyteczna, gdy po raz pierwszyspoglądasz na model programowania kontrolera.

Przede wszystkim zwróć uwagę na nazwy metod akcji kontrolera. Domyślnie w ASP.NET WebAPI stosowana jest konwencja polegająca na nadaniu metodzie akcji nazwy odpowiadającej me-todzie HTTP. Ujmując rzecz dokładniej, klasa ApiController wyszukuje metodę akcji o nazwierozpoczynającej się od odpowiedniej metody HTTP. Dlatego w kodzie przedstawionym w listingu3.2 żądanie HTTP GET do zasobu /api/values będzie obsłużone przez pozbawioną parametrówmetodę Get(). Framework oferuje różne sposoby dostosowania tej domyślnej logiki dopasowy-wania nazw i zapewnia możliwość rozbudowy mechanizmu, a nawet jego całkowite zastąpienie,jeśli istnieje potrzeba. Więcej szczegółowych informacji na temat wyboru kontrolera i akcji znaj-dziesz w rozdziale 12.

Poza wyborem metody akcji na podstawie metody HTTP ASP.NET Web API pozwala równieżwybrać akcję na podstawie elementów dodatkowych żądania, takich jak parametry ciągu teksto-wego zapytania. Co ważniejsze, framework obsługuje dołączanie tych elementów żądania do pa-rametrów metody akcji. Domyślnie używane jest połączenie obu podejść w celu przeprowadzeniaoperacji dołączania parametru, a sam algorytm obsługuje zarówno proste, jak i złożone typy .NET.W przypadku odpowiedzi HTTP model programowania ASP.NET Web API umożliwia metodomakcji zwrot typów .NET i konwertuje te wartości na odpowiednią postać części głównej komunikatuodpowiedzi HTTP, używając negocjacji treści. Więcej szczegółowych informacji na temat dołącza-nia parametrów i negocjacji treści znajdziesz w rozdziale 13.

Omówiliśmy już pewne aspekty projektu ASP.NET Web API, choć zaledwie dotknęliśmy tematumodelu programowania, analizując kod wygenerowany przez szablon projektu. Teraz możemypójść nieco dalej i utworzyć nasze pierwsze Web API typu „Witaj, świecie!”.

„Witaj, Web API!”Jako pierwszy przykład ASP.NET Web API utworzymy prostą usługę powitalną. Czy w świecieprogramowania istnieje bardziej znane powitanie niż „Witaj, świecie!”? Pracę rozpoczynamy więcod prostego, przeznaczonego tylko do odczytu API powitania, a następnie w pozostałej częścirozdziału dodamy kilka usprawnień, aby tym samym zaprezentować inne aspekty modelu pro-gramowania ASP.NET Web API.

Utworzenie usługiAby zbudować usługę, zacznij od utworzenia nowej aplikacji ASP.NET z poziomu okna dialogo-wego Nowy projekt w Visual Studio. W kolejnym oknie dialogowym jako rodzaj projektu wybierzWeb API. W ten sposób wygenerujesz nowy projekt ASP.NET Web API na podstawie szablonudomyślnego.

Usługa powitalna tylko do odczytu

Gdy masz wygenerowany projekt Web API na podstawie szablonu domyślnego, pierwszym zadaniemjest dodanie kontrolera. Możesz w tym celu po prostu dodać nową klasę lub skorzystać z oferowa-nego przez Visual Studio szablonu kontrolera. Aby dodać kontroler za pomocą szablonu, kliknij

Poleć książkęKup książkę

Page 26: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

80 Rozdział 3. Podstawy ASP.NET Web API

prawym przyciskiem myszy katalog Controllers, a następnie z menu kontekstowego wybierz opcjęDodaj/Kontroler… (rysunek 3.5).

Rysunek 3.5. Menu kontekstowe w Visual Studio umożliwiające dodanie nowego kontrolera

Na ekranie zostanie wyświetlone kolejne okno dialogowe, w którym podajesz dodatkowe infor-macje konfiguracyjne dla tworzonego kontrolera. Tworzymy kontroler o nazwie GreetingControlleri używamy do tego szablonu Kontroler Web API 2 — pusty (rysunek 3.6).

Rysunek 3.6. Szablon umożliwiający utworzenie kontrolera Web API

Poleć książkęKup książkę

Page 27: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

„Witaj, Web API!” 81

Po podaniu wymaganych informacji i kliknięciu przycisku OK w wyświetlonym oknie dialogo-wym nastąpi wygenerowanie nowej klasy GreetingController wywodzącej się z klasy ApiController.Aby nasze nowe API zwracało komunikat powitania, konieczne jest dodanie do tego kontrolerametody, która będzie potrafiła udzielać odpowiedzi na żądanie HTTP GET. Pamiętaj, że z powoduistnienia domyślnej reguły routingu kontroler GreetingController będzie wybierany dla żądaniaHTTP prowadzącego do zasobu api/greeting. Dlatego dodajemy prostą metodę przeznaczoną doobsługi żądań GET:

public class GreetingController : ApiController{ public string GetGreeting() { return "Witaj, wiecie!"; }}

Teraz możemy przetestować nasze Web API i sprawdzić, czy faktycznie zwraca zdefiniowanykomunikat powitania. W tym celu wykorzystamy narzędzie o nazwie Fiddler8 przeznaczone dodebugowania proxy HTTP. Jedną ze szczególnie użytecznych funkcji narzędzia Fiddler podczastestowania Web API jest możliwość tworzenia komunikatów HTTP i ich wykonywania. Tej funkcjiużyjemy do przetestowania naszego API (rysunek 3.7).

Rysunek 3.7. Utworzenie nowego żądania HTTP za pomocą narzędzia Fiddler

Po wykonaniu żądania można przeanalizować zarówno żądanie, jak i odpowiedź, używając do tegopokazanego na rysunku 3.8 panelu inspektora sesji w narzędziu Fiddler.

Zgodnie z oczekiwaniami przedstawione tutaj proste żądanie HTTP GET do naszej usługi powitalnejpowoduje zwrot ciągu tekstowego „Witaj, świecie!”.

Negocjacja treści

Powracamy na chwilę do rysunku 3.8, aby nieco dokładniej przyjrzeć się nagłówkowi HTTPContent-Type. Domyślnie ASP.NET Web API spowoduje transformację wartości zwrotnych metodakcji na format JSON za pomocą popularnej biblioteki Json.NET, o której po raz pierwszy wspo-mnieliśmy na rysunku 3.3. Zgodnie jednak z informacjami przedstawionymi we wcześniejszej częścirozdziału ASP.NET Web API obsługuje opartą na serwerze negocjację treści, a domyślny wybórodbywa się między formatami JSON i XML. Aby zobaczyć to w działaniu, powróć do panelu tworze-nia żądania w narzędziu Fiddler i dodaj poniższy wiersz kodu w polu tekstowym przeznaczonymdla nagłówków żądania:

accept: application/xml

8 http://www.telerik.com/fiddler

Poleć książkęKup książkę

Page 28: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

82 Rozdział 3. Podstawy ASP.NET Web API

Rysunek 3.8. Analizowanie żądań i odpowiedzi HTTP za pomocą narzędzia Fiddler

Teraz ponownie wykonaj żądanie; zauważysz, że odpowiedź zawiera nagłówek Content-Type:application/xml, a część główna odpowiedzi została sformatowana jako XML (rysunek 3.9).

Rysunek 3.9. Przykład negocjacji treści w przypadku żądania do naszej usługi powitalnej i odpowiedzi na tożądanie

Poleć książkęKup książkę

Page 29: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

„Witaj, Web API!” 83

Dodanie powitania

Wprawdzie interesująca może być możliwość otrzymywania powitania w różnych formatach, alenieco bardziej skomplikowane API wymagają możliwości przeprowadzania operacji na stanie lubdanych systemu. Dlatego rozbudujemy naszą usługę powitalną i umożliwimy klientom dodawanienowych powitań. Idea polega na tym, aby klient mógł podać nazwę powitania i komunikat, dodaćje do usługi, a następnie otrzymać w odpowiedzi na żądanie GET po podaniu w adresie URL nazwyinteresującego go powitania. Ponadto trzeba zapewnić obsługę sytuacji, w której klient, podając na-zwę powitania w adresie URL zrobi literówkę lub inny błąd. Wówczas powinien zostać zwróconykod stanu HTTP 404 informujący o braku możliwości odnalezienia wskazanego zasobu.

Aby umożliwić klientowi utworzenie nowego powitania w serwerze, konieczne jest przygotowanieklasy modelu przeznaczonej do przechowywania nazwy powitania oraz właściwości komunikatu.Spełniamy ten wymóg przez dodanie przedstawionej poniżej klasy do katalogu Models projektu:

public class Greeting{ public string Name { get; set; }

public string Message { get; set; }}

Kolejnym krokiem jest utworzenie w kontrolerze GreetingController metody akcji odpowiedzialnejza obsługę żądania HTTP POST i akceptującej parametr w postaci egzemplarza Greeting.

Owa metoda akcji dodaje powitanie do statycznej listy powitań i zwraca kod stanu HTTP 201wraz z nagłówkiem Location zawierającym adres URL prowadzący do nowo utworzonego zasobupowitania. Dodatkowy nagłówek Location pozwala klientom podążać za wartością łącza zamiastwymagać od nich przygotowania adresu URL dla nowego zasobu powitania. Tym samym rozwią-zanie staje się bardziej niezawodne, ponieważ struktury adresów URL serwera mogą ulegać zmianiena przestrzeni czasu:

public static List<Greeting> _greetings = new List<Greeting>();

public HttpResponseMessage PostGreeting(Greeting greeting){ _greetings.Add(greeting);

var greetingLocation = new Uri(this.Request.RequestUri, "greeting/" + greeting.Name); var response = this.Request.CreateResponse(HttpStatusCode.Created); response.Headers.Location = greetingLocation;

return response;}

Po dodaniu nowego powitania do kolekcji statycznej tworzymy egzemplarz URI przedstawiającymiejsce, gdzie nowe powitanie może być znalezione w trakcie kolejnych żądań. Kolejnym krokiemjest utworzenie nowego obiektu HttpResponseMessage za pomocą metody fabryki CreateResponse()

Poleć książkęKup książkę

Page 30: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

84 Rozdział 3. Podstawy ASP.NET Web API

egzemplarza HttpRequestMessage dostarczonego przez klasę ApiController. Możliwość pracy z po-ziomu metod akcji z egzemplarzami obiektów modelu HTTP stanowi kluczową cechę ASP.NETWeb API, zapewnia dokładną kontrolę nad elementami komunikatów HTTP, takimi jak nagłówkiLocation, w sposób nieopierający się na statycznych obiektach kontekstu, na przykład HttpContexti WebOperationContext. To staje się szczególnie użyteczne podczas tworzenia testów jednostkowychdla kontrolerów Web API, czym zajmiemy się już wkrótce.

Na koniec musimy jeszcze dodać przeciążoną metodę GetGreeting(), która będzie potrafiła pobraći zwrócić powitanie dostarczone przez klient:

public string GetGreeting(string id){ var greeting = _greetings.FirstOrDefault(g => g.Name == id); return greeting.Message;}

Powyższa metoda wyszukuje pierwsze powitanie, dla którego właściwość Name zostanie dopaso-wana do podanego parametru id, a następnie zwraca właściwość Message. Warto zwrócić uwagę,że na obecnym etapie nie są przeprowadzane żadne operacje weryfikacji danych wejściowych pa-rametru id. Do tego zagadnienia powrócimy jednak w kolejnej sekcji.

Domyślnie część główna żądania HTTP POST jest obsługiwana przez obiekt MediaTypeFormatterwybrany na podstawie nagłówka żądania Content-Type. Odpowiednio, kolejne żądanie HTTP będzieobsłużone przez domyślny formater JSON, który używa biblioteki Json.NET do deserializacji ciągutekstowego JSON na postać egzemplarza klasy Greeting:

POST http://localhost:50650/api/greeting HTTP/1.1Host: localhost:50650Content-Type: application/jsonContent-Length: 43

{"Name": "TestGreeting","Message":"Witaj!"}

Otrzymany egzemplarz może być następnie przekazany metodzie PostGreeting(), za pomocą którejzostanie dodany do kolekcji powitań. Po przetworzeniu żądania przez metodę PostGreeting() klientotrzyma następującą odpowiedź HTTP:

HTTP/1.1 201 CreatedLocation: http://localhost:50650/api/greeting/TestGreeting

Na podstawie informacji znajdujących się w nagłówku Location klient może wykonać żądanie donowego powitania:

GET http://localhost:50650/api/greeting/TestGreeting HTTP/1.1Host: localhost:50650

Podobnie jak w przypadku opracowanej na początku usługi powitania tylko do odczytu, klientmoże spodziewać się otrzymania następującej odpowiedzi:

HTTP/1.1 200 OKContent-Type: application/json; charset=utf-8Content-Length: 8

"Witaj!"

Poleć książkęKup książkę

Page 31: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

„Witaj, Web API!” 85

Obsługa błędów

Pokazany powyżej przykład wymiany komunikatów HTTP sprawdza się doskonale, o ile serwernigdy nie napotka żadnych błędów, a wszystkie klienty będą korzystać z tych samych zasad i kon-wencji. Być może zastanawiasz się, co się stanie w przypadku wystąpienia błędu serwera lubotrzymania przez niego nieprawidłowego żądania. To jest kolejny obszar, na którym możliwośćtworzenia egzemplarzy obiektów modelu HTTP i pracy z nimi okazuje się niezwykle użyteczna. Me-toda akcji przedstawiona w listingu 3.3 zwraca ciąg tekstowy powitania pobrany na podstawie jegonazwy. Jednak w przypadku nieznalezienia nazwy wskazanego powitania zwrócona będzie odpo-wiedź wraz z kodem stanu HTTP 404. Do obsługi tego rodzaju sytuacji ASP.NET Web API oferujewyjątek HttpResponseException.

Listing 3.3. Zwrot kodu stanu HTTP 404, gdy wskazane powitanie nie zostanie znalezionepublic string GetGreeting(string id){ var greeting = _greetings.FirstOrDefault(g => g.Name == id); if (greeting == null) throw new HttpResponseException(HttpStatusCode.NotFound); return greeting.Message;}

Wprawdzie rozsądne będzie zwrócenie nowego obiektu HttpResponseMessage zawierającego kodstanu HTTP 404, ale to zawsze wymaga zwrotu HttpResponseMessage z poziomu metody akcji GetGreeting(), co oznacza niepotrzebne skomplikowanie ścieżki kodu pozbawionej obsługi wyjątku.

Ponadto komunikat odpowiedzi musiałby zostać przekazany przez cały potok Web API, co w przy-padku wyjątku jest prawdopodobnie niepotrzebne. Z tych powodów zdecydowaliśmy się na zgło-szenie wyjątku HttpResponseException zamiast zwracać obiekt HttpResponseMessage z metody akcji.W przypadku wyjątku zawierającego część główną odpowiedzi obsługującą negocjację treści zawszemożna użyć metody Request.CreateErrorResponse() z klasy bazowej kontrolera i przekazać otrzy-many obiekt HttpResponseMessage do konstruktora HttpResponseException.

Testowanie API

Kolejną zaletą bezpośredniej pracy z egzemplarzami obiektów modelu HTTP zamiast ze statycz-nymi obiektami kontekstu jest możliwość tworzenia odpowiednich testów jednostkowych dlakontrolerów Web API. Szczegółowe omówienie tematu testowania znajdziesz w rozdziale 17.Tutaj jednak, tytułem wprowadzenia do tego zagadnienia, utworzymy krótki test jednostkowy dlametody akcji PostGreeting() zdefiniowanej w kontrolerze GreetingController:

[Fact]public void TestNewGreetingAdd(){ // Przygotowanie var greetingName = "newgreeting"; var greetingMessage = "Witaj, test!"; var fakeRequest = new HttpRequestMessage(HttpMethod.Post, "http://localhost:9000/api/greeting"); var greeting = new Greeting { Name = greetingName, Message = greetingMessage };

var service = new GreetingController(); service.Request = fakeRequest; // Dzia anie

Poleć książkęKup książkę

Page 32: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

86 Rozdział 3. Podstawy ASP.NET Web API

var response = service.PostGreeting(greeting);

// Asercja Assert.NotNull(response); Assert.Equal(HttpStatusCode.Created, response.StatusCode); Assert.Equal(new Uri("http://localhost:9000/api/greeting/newgreeting"), response.Headers.Location);}

W przedstawionym powyżej teście został zastosowany typowy wzorzec przygotowanie, działaniei asercja, powszechnie używany w testach jednostkowych. Możemy utworzyć pewien stan kontrolny,między innymi egzemplarz HttpRequestMessage, w celu przedstawienia całego żądania HTTP. Na-stępnie wywołujemy metodę w teście, używając kontekstu, a na koniec przetwarzamy kilka asercjizwiązanych z odpowiedzią. W omawianym przykładzie odpowiedź jest egzemplarzem HttpResponseMessage, natomiast w wyniku otrzymujemy możliwość przetworzenia asercji w elementach danych

samej odpowiedzi.

KlientJak wspomnieliśmy na początku rozdziału, jedną z podstawowych korzyści płynących ze zbudo-wania ASP.NET Web API na podstawie modelu programowania HTTP jest fakt, że ten sam mo-del programowania może być wykorzystany do tworzenia doskonałych aplikacji HTTP zarówno dlaserwera, jak i dla klienta. Na przykład za pomocą przedstawionego poniżej kodu tworzymy żądanie,które zostanie obsłużone przez naszą pierwszą metodę akcji GetGreeting():

class Program{ static void Main(string[] args) {

var greetingServiceAddress = new Uri("http://localhost:50650/api/greeting");

var client = new HttpClient(); var result = client.GetAsync(greetingServiceAddress).Result; var greeting = result.Content.ReadAsStringAsync().Result;

Console.WriteLine(greeting); }}

Podobnie jak w przypadku serwera, kod działający po stronie klienta tworzy i przetwarza egzem-plarze HttpRequestMessage i HttpResponseMessage. Ponadto komponenty rozszerzające ASP.NETWeb API, takie jak formatery typów danych i procedury obsługi komunikatów, działają zarównoz klientami, jak i z serwerami.

HostOpracowanie ASP.NET Web API z przeznaczeniem do hostingu w tradycyjnej aplikacji ASP.NETwydaje się niezwykle podobne do procesu opracowania aplikacji typu ASP.NET MVC. Ale jednąz doskonałych cech ASP.NET Web API jest możliwość hostingu w dowolnym procesie bez ko-nieczności wykonywania w tym celu dodatkowej pracy. Listing 3.4 przedstawia kod niezbędny do

Poleć książkęKup książkę

Page 33: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Podsumowanie 87

hostingu naszego kontrolera GreetingController w innym procesie hosta (w omawianym przy-kładzie jest to aplikacja działająca w konsoli).

Listing 3.4. Prosty hosting Web API w postaci aplikacji działającej konsoliclass Program{ static void Main(string[] args) { var config = new HttpSelfHostConfiguration( new Uri("http://localhost:50651"));

config.Routes.MapHttpRoute( name: "DefaultApi", routeTemplate: "api/{controller}/{id}", defaults: new { id = RouteParameter.Optional });

var host = new HttpSelfHostServer(config);

host.OpenAsync().Wait();

Console.WriteLine("Naci nij dowolny klawisz, aby zako czy dzia anie."); Console.ReadKey();

host.CloseAsync().Wait(); }}

Do hostingu Web API we własnym procesie nie musieliśmy modyfikować kontrolera ani doda-wać żadnego magicznego kodu XML w pliku app.config. Zamiast tego po prostu utworzyliśmyegzemplarz HttpSelfHostConfiguration, skonfigurowaliśmy go, podając niezbędne informacjedotyczące adresu i routingu, a następnie otworzyliśmy host. Kiedy host jest otwarty i nasłuchujeżądań, blokujemy wątek główny konsoli, aby uniknąć zamknięcia serwera. Gdy użytkownik zde-cyduje się na zamknięcie hosta (przez naciśnięcie dowolnego klawisza), wtedy zamykamy host WebAPI i kończymy działanie aplikacji w konsoli. Szczegółowe omówienie tematu hostingu znajdzieszw rozdziale 11.

PodsumowanieW tym rozdziale omówiliśmy pewne kluczowe cele projektowe stojące za ASP.NET Web API.Wykorzystaliśmy domyślny szablon projektu Web API, aby zobaczyć, jak różne komponenty two-rzące framework zostały zorganizowane i jak są rozprowadzane za pomocą menedżera pakietówNuGet. Na podstawie analizy kodu szablonu domyślnego rozpoczęliśmy także omawianie modeluprogramowania frameworku. Później utworzyliśmy naszą pierwszą usługę Web API typu „Witaj,świecie!” i wykorzystaliśmy możliwości ASP.NET Web API w zakresie samohostowania.

W kolejnych rozdziałach znajdziesz znacznie dokładniejsze omówienie tematów wprowadzonychw tym rozdziale. Zaczynamy od rozdziału 4., w którym przedstawiliśmy mechanizmy umożliwiającedziałanie ASP.NET Web API.

Poleć książkęKup książkę

Page 34: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

88 Rozdział 3. Podstawy ASP.NET Web API

Poleć książkęKup książkę

Page 35: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

475

Skorowidz

.NET Framework, 355

AActionFilterAttribute, 437adres

URI, 25, 325URL, 112, 275

akceptacja, 169akcje, 309aktywacja kontrolera, 301ALPS, application-level profile semantics, 132analizowanie żądań HTTP, 82antywzorzec usługi, 223API, 17, 85

GitHub, 140homogeniczne, 153tworzenie, 159zorientowane na zasoby, 58

aplikacja, 105, 260cele, 113przebieg działania, 227przepływ zdarzeń, 141wersjonowanie, 110

aplikacje klienta, 399architektura

hostingu ASP.NET, 270przetwarzania, 89przetwarzania ASP.NET, 90sieci, 24WCF, 271

ARPANET, 23asercje, 380

SAML, 380ASP.NET Web API, 72ASP.NET Web API 101, 67atak

CSRF, 408typu MITM, 358, 466

atrybut, 117AuthorizeAttribute, 388EnableCorsAttribute, 394

atrybuty adnotacji danych, 331audyt zmian, 209, 210autoryzacja, 308, 386

egzekwowanie, 388na podstawie zakresu, 416podstawowa, 387

AWS, Amazon Web Services, 209Azure Service Bus, 284Azure Storage, 43

Bbaza danych, 25BDD, behavior-driven development, 14, 71, 160bezpieczeństwo, 347, 464

transportu, 347wątków, 337

biblioteka Thinktecture.IdentityModel, 390biblioteki, 161

klienta, 218opakowujące, 218

bindery modelu, 319, 323buforowanie, 38, 41, 455–458

danych wyjściowych, 200koncepcja weryfikacji, 39koncepcja wygaśnięcia, 39utrata ważności, 39

CCDN, content delivery network, 33cele aplikacji, 113certyfikat, 465, 468

klienta, 361testowy, 471

CLR, common language runtime, 99

Poleć książkęKup książkę

Page 36: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

476 Skorowidz

cofnięcie certyfikatu, 471Cool URI, 26CORS, cross-origin resource sharing, 391CRL, certificate revocation lists, 471CRUD, create, read, update, delete, 169CSRF, cross-site request forgery, 374, 392, 408

Ddane

odwołania, 140wyjściowe, 198

DARPA, 23delegowanie

ograniczonej autoryzacji, 397uprawnień, 397uwierzytelniania, 397

deserializacja łączy, 225dokument zgłoszenia błędu, 463dołączanie, 321

modelu, 312–316, 325parametru, 98, 99

dostawcatożsamości, 356wartości, 320

dostęp do chronionych zasobów, 401dyspozytor, 296

kontrolerów, 95tras, 95

działanieaplikacji, 227bufora, 41

Eegzekwowanie autoryzacji, 388element HttpControllerDispatcher, 297encja, 25, 308ETag, entity tag, 40ewolucja, 106

Ffiltry, 306

akcji, 101, 309autoryzacji, 101, 308uwierzytelniania, 101, 307, 375wyjątków, 310

format, 145Collection+Json, 182JSON, 27, 149vCard, 48XML, 27

formatery, 315synchroniczne, 329

formatynowe, 129popularne, 128proste, 126

formularz rejestracji klienta, 400framework

ASP.NET, 73OAuth 2.0, 397, 407uwierzytelniania, 397uwierzytelniania HTTP, 367xUnit.NET, 422

frameworki testów jednostkowych, 420funkcjonalności, 197

Ggenerowanie podpisu komunikatu, 384globalna konfiguracja Web API, 267grupy atrybutów, 117

HHAL, hypertext application language, 27, 134Hawk, 385H-Factors, 60hipermedia, 58, 131, 136HMAC, hash-based message authentication code,

43, 209, 383host, 86hosting, 71

Azure Service Bus, 284IIS, 349OWIN, 92w pamięci, 284, 285Web API, 275WWW, 92, 260

HTTP, Hypertext Transfer Protocol, 14, 17, 24, 29buforowanie, 38kody stanu, 37metody, 33, 36pośredniki, 32uwierzytelnianie, 42wymiana komunikatów, 30

HTTP 1.1, 29

Poleć książkęKup książkę

Page 37: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Skorowidz 477

IIANA, 27, 150, 464identyfikatory typów danych, 112IETF, Internet Engineering Task Force, 29, 137IIS, internet information services, 71, 92, 361imitacje, 426implementacja

ActionFilterAttribute, 333ASP.NET Web API, 427FormatterParameterBinder, 326interfejsu IValueProvider, 321IssueModelBinder, 324JsonMediaTypeFormatter, 327MediaTypeFormatter, 328ModelBindingParameterBinder, 320monitorowania, 214obsługi zgłoszenia błędu, 212uwierzytelniania, 369w stylu BDD, 160wykrywania konfliktów, 206zgłoszenia błędu, 211

infrastruktura ASP.NET, 260interfejs

ICorsPolicyProviderFactory, 395IHttpActionResult, 100, 432IHttpController, 302IHttpControllerSelector, 299IValueProvider, 321OWIN, 276

interfejsy filtrów, 101interoperacyjność, 464ISAM, indexed sequential access method, 127

JJSON, 27, 149JWT, JSON web token, 380

Kkanał

nieoficjalny, 407oficjalny, 407

Katana, 277klasa

ActionFilterAttribute, 437ApiController, 84, 97, 100, 366Assert, 423

AuthorizationContext, 389AuthorizationFilterAttribute, 308Claim, 354ClaimsAuthorizationManager, 390ClaimsIdentity, 354DataContractSerializer, 327ExceptionFilterAttribute, 310FormUrlEncodedContent, 250HttpClient, 335

bezpieczeństwo wątków, 337cykl życiowy, 335metody pomocnicze, 337opakowanie, 336wiele egzemplarzy, 336wyjątki, 338

HttpConfiguration, 216HttpContent, 247HttpContentHeaders, 243HttpHeaders, 246HttpMessageHandler, 436HttpMessageInvoker, 295HttpMethodOverrideHandler, 341HttpPropertyKeys, 242HttpRequestHeaders, 243HttpRequestMessage, 239HttpResponseHeaders, 243HttpResponseMessage, 239HttpSelfHostServer, 272HttpServer, 295HttpServiceBusServer, 287IssueController, 181IssueLinkFactory, 168IssuerNameRegistry, 364IssuesState, 164IssueState, 164IssueStateFactory, 166Link, 166LinkFactory, 167MediaTypeFormatter, 326, 327, 433SelfHostConfiguration, 273ValuesController, 79WebApiConfiguration, 173XmlSerializer, 327

klasyfiltrów, 306kontenerów nagłówków, 245routingu w ASP.NET, 263routingu Web API, 265

Poleć książkęKup książkę

Page 38: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

478 Skorowidz

klient, 86, 217, 232poufny, 400publiczny, 400

kluczeprywatne, 465publiczne, 361, 465testowe, 471

kody stanu HTTP, 38kolekcja

MediaTypeMappings, 327zasobów, 120grup atrybutów, 117

kolekcje zgłoszeń błędów, 119komunikaty, 238, 247, 248

klienta, 341samoopisujące się, 108

koncepcje projektu sieci, 24konfiguracja

globalna, 266Web API, 280

konflikty, 206konstruktor klasy IssueController, 181kontrakty, 126kontrola dostępu, 275kontroler, 291, 301

IssueController, 176IssueProcessorController, 194Web API, 80

konwencje nazw, 463konwersja na HttpResponseMessage, 100konwerter wyniku akcji, 313koszt zmiany, 108kryptografia klucza publicznego, 465kryteria akceptacji, 169

Llista zasobów, 153logika wyboru kontrolera, 299

Łłańcuch certyfikatu, 469łącza, 139

jako funkcje, 222jako zakładki, 226

MMAC, message authentication codes, 348magazyn

dla zgłoszeń błędów, 163zaufania, 467

mapowaniekonceptualne, 25tożsamości, 363

mechanizmCORS, 393o chunked transfer encoding, 254

menedżer uwierzytelniania, 374menu kontekstowe, 80metadane

osadzone, 148zewnętrzne, 148

metodaCanReadType(), 327CanWriteType(), 327CheckAccess(), 389ExecuteBindingAsync(), 317FindAsync(), 195Get(), 201, 428GetAsync(), 339GetSearch(), 185HTTP PATCH, 188IsValidAction(), 195Post(), 429SelectController(), 299SendAsync(), 340SerializeToStreamAsync(), 256Trace(), 214TryComputeLength(), 256UseWebApi(), 280WriteToStreamAsync(), 434

metody HTTP, 33, 36, 56MIME, 28MITM, man-in-the-middle, 358, 466model, 163, 315

autoryzacji, 387dojrzałości Richardsona, 52informacji, 114, 118oświadczeń, 352programowania HTTP, 237przetwarzania ApiController, 302przetwarzania ASP.NET Web API, 91zasobu, 122

modele zasobów, 119

Poleć książkęKup książkę

Page 39: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Skorowidz 479

moduły, 261monitorowanie, 213

zgłoszeń błędów, 153

Nnagłówek

ETag, 40Location, 83

nagłówki, 242HTTP, 447komunikatu, 36, 447odpowiedzi, 37, 449reprezentacji, 37, 450żądania, 36, 448, 449

narzędzieFiddler, 82makecert, 472

NAT, network address translatio, 285nazwy domen, 351negocjacja treści, 38, 81

odpowiedzi, 41proaktywna, 451reaktywna, 452

niestandardowe klasy zawartości, 255

OOAuth 2.0, 397, 407obiekt

HttpControllerDescriptor, 301HttpRequestMessage, 241IOwinContext, 281

obsługabłędów, 85buforowania, 198dyspozytora trasy, 96formatów, 70hipermediów, 146, 182komunikatów, 93, 292, 363, 368, 376komunikatów klienta, 341kontrolera, 96mechanizmu CORS, 393odpowiedzi, 343pobierania buforowanych danych, 203tokenów dostępu, 412tras, 95, 298Web API ASP.NET, 268wersji, 230wielu formatów, 156zmian, 106

OCSP, online certificate status protocol, 471odpowiedź, 225, 343ograniczenia REST, 63opcje uwierzytelniania, 371OpenID Connect, 415, 416operacje asynchroniczne, 225oprogramowanie pośredniczące Web API, 281, 370organizacja IANA, 27organizacja testu jednostkowego, 423ORM, object-relational mapping, 221osadzanie łączy, 142osadzone relacje łączy, 152OWIN, 276, 283

Ppakiety, 161

NuGet, 73–75parametry, 98plik

app.config, 87ValuesController.cs, 78WebApiConfig.cs, 76

pliki .pfx, 473pobieranie

buforowanych danych, 202, 203tokenu dostępu, 402wszystkich zgłoszeń błędów, 200zgłoszenia błędu, 174, 179, 182

nieistniejącego, 179otwartego, 177zamkniętego, 177

pomiar kontrolek hipermediów, 60pośredniki, 32potok

filtrów, 98kontrolera, 302, 303procedur obsługi komunikatów, 292, 293

powiązane zasoby, 116procedura

CorsMessageHandler, 395procedury obsługi, 261

komunikatów klienta, 341odpowiedzi, 343, 344Web API ASP.NET, 268

profile, 132semantyczne, 135typów danych, 49

Poleć książkęKup książkę

Page 40: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

480 Skorowidz

programowanieBDD, 14, 160HTTP, 68po stronie klienta, 69po stronie serwera, 69TDD, 14, 423

projekt, 159Katana, 277Web API, 75

protokółHTTP, 14, 17OCSP, 471

proxy, 342przepływ

danych, 282kodu autoryzacji, 406, 416komunikatów HTTP, 291zdarzeń, 141, 459

przerwanie na żądanie, 339przetwarzanie

tokenów dostępu, 411zgłoszenia błędu, 193

przypisywanie zleceniodawcy, 356

RRDF, resource description framework, 132refaktoryzacja kodu, 424rejestracja

relacji łącza, 153typu danych, 27, 150

relacje łączanowe, 151osadzone, 152rejestracja, 153rozszerzenia, 152standardowe, 151

REPL, read-eval-print loop, 233reprezentacja, 26

JSON, 50PNG, 51zasobu, 31

REST, representational state transfer, 59, 63ograniczenia, 63

rezerwacja adresu URL, 275RIA, rich internet applications, 48rodzaje

kontraktów, 126pośredników, 33

routing, 291ASP.NET, 262Web API, 264

rozszerzalność, 148rozszerzenia relacji łączy, 152RPC, remote procedure call, 52RSK, REST starter kit, 335

SSAML, 380samohostowanie, 92, 162, 270, 351samoopisywanie się, 108, 125schematy uwierzytelniania, 42, 43

AWS, 43Azure Storage, 43Hawk, 385OAuth 2.0, 43

SDK, software development kit, 286selektor akcji, 304semantyka, 137Service Bus, 286serwer

autoryzacji, 399, 402, 410CDN, 33zasobów, 410

serwis GitHub, 400sieć

ARPANET, 24CDN, 33

SOAP, 45, 107SPA, single-page applications, 399specyfikacja, 108

formatu, 142OpenID Connect, 415typu danych, 463

sprawdzaniecertyfikatu, 363poprawności, 332poprawności modelu, 331buforowania, 200

SSL, secure socket layer, 348stan klienta, 234stosowalność, 147strumieniowanie, 254styl

API, 51REST, 63RPC, 52

Poleć książkęKup książkę

Page 41: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

Skorowidz 481

subdomeny, 115szablony, 80

Śścieżka certyfikacji serwera, 470środowisko

OWIN, 283uruchomieniowe CORS, 394

TTAP, task asynchronous pattern, 94TDD, test-driven development, 14, 71, 160, 419test jednostkowy, 421testowanie, 419

API, 85test, 175

integracji, 442testy jednostkowe, 71, 419

ApiController, 427cykle czerwone i zielone, 424HttpMessageHandler, 436imitacje, 426implementacji ASP.NET Web API, 427MediaTypeFormatter, 433metody Get(), 428metody Post(), 429metody WriteToStreamAsync(), 434programowanie TDD, 423refaktoryzacja kodu, 424tras, 440wstrzykiwanie zależności, 426xUnit.NET, 422

TLS, transport layer security, 348, 362token, 378

dostępu, 401, 402, 411refresh, 409

tożsamość serwera, 350TPL, task paraller library, 327trasy, 95

oparte na atrybutach, 298tworzenie

API, 159klienta, 217komunikatu, 250testowych certyfikatów, 471testowych kluczy, 471usługi, 79

wersji API, 110zgłoszenia błędu, 186

typ mediówCollection+Json, 136Siren, 136

typy danych, 27, 118, 126, 445charakterystyczne dla domeny, 48ogólne, 132rejestracja, 150specyfikacja, 463w domenie, 153

typy hipermediów, 131, 136typy relacji łączy, 137

Uuaktualnianie zgłoszenia błędu, 188, 190uprawnienia kodu autoryzacji, 404URI, 25URL, universal resource locator, 26URN, universal resource name, 26urząd certyfikacji, 350, 466usługa, 163

checkcode.example, 397domyślna, 300powitalna, 79, 83SOAP, 45, 187WCF, 68

usprawnianie API, 197usuwanie

nieistniejącego zgłoszenia błędu, 192zgłoszenia błędu, 191

uwierzytelnianie, 42, 351AWS, 43filtry, 375Hawk, 210, 385klienta, 361klienta w proxy, 460klienta w serwerze źródłowym, 459, 461OAuth 2.0, 413oparte na tokenie, 378oparte na HTTP, 369oparte na transporcie, 357oprogramowanie aktywne, 374oprogramowanie pasywne, 374oprogramowanie pośredniczące, 370podstawowe, 368, 373przepływ zdarzeń, 459serwera, 357

Poleć książkęKup książkę

Page 42: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17

482 Skorowidz

użycieatrybutu AuthorizeAttribute, 388procedur obsługi odpowiedzi, 346Service Bus, 286TLS, 349TLS z hostingiem IIS, 349TLS z samohostowaniem, 351tokenu JWT, 381

Wwarstwa

hostingu, 91obsługi kontrolera, 96pośrednia, 139potoku procedur obsługi komunikatów, 93

WCF, windows communication foundation, 68Web API, 14, 17, 45–65, 72wersjonowanie, 110

oparte na treści, 111typu danych, 111w adresie URL, 112

weryfikacja modelu, 312Windows Azure, 284Windows Identity Foundation, 355właściwości metody, 35

bezpieczeństwo, 35buforowalność, 35idempotentność, 35

WSDL, web service description language, 45, 125WSGI, 93współdzielenie zasobów, 391wstrzykiwanie zależności, 426wybór

akcji, 303formatu, 145HttpParameterBinding, 318kontrolera, 297, 299typu danych, 125Web API, 73

wyjątki, 310wykrywanie konfliktów, 206wymiana komunikatów HTTP, 30wyniki weryfikacji, 332wyszukiwanie zgłoszeń błędów, 184

wywołanieakcji, 313procedury obsługi komunikatu, 295

XXML, 27xUnit.NET, 422

Zzakres, 406zasoby, 54

chronione, 401osadzone, 139wyszukiwania danych, 120, 184

zasób, 25elementu, 120, 155główny, 119wykrycia, 156wyszukiwania, 157

zawartość komunikatu, 247zgłoszenie błędu, 163, 463zmiana, 209, 230znacznik <form>, 138

Źźródło typu danych, 28

Żżądania

warunkowe, 35HTTP, 89uprawnienia autoryzacji, 405

żądanie, 225DELETE, 34GET, 33, 455–457HEAD, 34OPTIONS, 34PATCH, 34POST, 34PUT, 34, 457, 458SOAP, 68TRACE, 35

Poleć książkęKup książkę

Page 44: Księgarnia internetowa informatyczna Helion.pl - Tytuł oryginału: … · 2021. 3. 17. · 3 Spis treści Wprowadzenie ..... 13 Wstęp ..... 17