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



Podobne dokumenty
Tworzenie i wykorzystanie usług sieciowych

Java JMX. Marcin Werla. Monitorowanie i zarządzanie usługami sieciowymi w Javie. mwerla@man.poznan.pl PCSS/Poznań JUG

Wybrane działy Informatyki Stosowanej

Wybrane działy Informatyki Stosowanej

Zaawansowane aplikacje internetowe - laboratorium Web Services (część 1).

Programowanie Komponentowe WebAPI

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

Wzorce logiki dziedziny

Wywoływanie metod zdalnych

Wywoływanie metod zdalnych

Programowanie obiektowe

Katalog książek cz. 2

Aplikacje RMI

Web Service y w Javie

Google Web Toolkit Michał Węgorek ZPO 2009

Wzorce prezentacji internetowych

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

Aplikacje RMI Lab4

JAVA EE MODEL APLIKACJI. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Podejście obiektowe do budowy systemów rozproszonych

Remote Method Invocation 17 listopada Dariusz Wawrzyniak (IIPP) 1

Wprowadzenie do technologii Web Services: SOAP, WSDL i UDDI

1. Uruchomić i skonfigurować środowisko tworzenia aplikacji i serwer aplikacji.

RESTful Android. Na co zwrócić uwagę przy tworzeniu aplikacji klienckich REST na Androidzie

2) W wyświetlonym oknie należy zaznaczyć chęć utworzenia nowej aplikacji (wygląd okna może się różnić od powyższego); kliknąć OK

Obiektowe programowanie rozproszone Java RMI. Krzysztof Banaś Systemy rozproszone 1

Zdalne wywołanie metod - koncepcja. Oprogramowanie systemów równoległych i rozproszonych Wykład 7. Rodzaje obiektów. Odniesienie do obiektu

Remote Method Invocation 17 listopada 2010

Oprogramowanie systemów równoległych i rozproszonych Wykład 7

Katedra Architektury Systemów Komputerowych Wydział Elektroniki, Telekomunikacji i Informatyki Politechniki Gdańskiej

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Język JAVA podstawy. wykład 2, część 1. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Technologie dla aplikacji klasy enterprise. Wprowadzenie. Marek Wojciechowski

JAVA. Java jest wszechstronnym językiem programowania, zorientowanym. apletów oraz samodzielnych aplikacji.

1. Czynności przygotowujące aplikację działającą na platformie Java SE Biblioteka5 (należy ją pobrać z załącznika z p.1)

UML a kod w C++ i Javie. Przypadki użycia. Diagramy klas. Klasy użytkowników i wykorzystywane funkcje. Związki pomiędzy przypadkami.

Kurs programowania. Wykład 1. Wojciech Macyna. 3 marca 2016

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

Remote Method Invocation 17 listopada rozproszonych. Dariusz Wawrzyniak (IIPP) 1

public interface TravelAgent { public void makereservation(int cruiseid, int cabinid, int customerid, double price); }

JAVA W SUPER EXPRESOWEJ PIGUŁCE

Nexto.API. Przykładowy klient Java 1.6 do systemu zamówień NextoAPI. Przygotował Rafał Ozga e-kiosk S.A. Maj 2015,

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Enterprise JavaBeans

Aplikacje internetowe i rozproszone - laboratorium

Programowanie komponentowe 5

Tworzenie i wykorzystanie usług

1 Wprowadzenie do J2EE

Systemy Rozproszone - Ćwiczenie 6

Podejście obiektowe do budowy systemów rozproszonych

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Interfejsy. Programowanie obiektowe. Paweł Rogaliński Instytut Informatyki, Automatyki i Robotyki Politechniki Wrocławskiej

Wykład dla studentów Informatyki Stosowanej UJ 2012/2013

Programowanie w języku Java - Wyjątki, obsługa wyjątków, generowanie wyjątków

Wykorzystywanie parsera DOM w programach Java i PL/SQL

Java. Programowanie Obiektowe Mateusz Cicheński

Contexts and Dependency Injection (CDI) Autor wykładu: Marek Wojciechowski

METODY PROGRAMOWANIA

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

Komponenty sterowane komunikatami

1. CZYM JEST SERIALIZACJA

Instrukcja 10 Laboratorium 13 Testy akceptacyjne z wykorzystaniem narzędzia FitNesse

PLAN WYNIKOWY PROGRAMOWANIE APLIKACJI INTERNETOWYCH. KL III TI 4 godziny tygodniowo (4x30 tygodni =120 godzin ),

SOAP. Autor: Piotr Sobczak

Dostęp do komponentów EJB przez usługi Web Services

Języki Programowania II Wykład 3. Java podstawy. Przypomnienie

Programowanie obiektowe

Wybrane działy Informatyki Stosowanej

Wspomaganie pracy w terenie za pomocą technologii BlackBerry MDS. (c) 2008 Grupa SPOT SJ

Programowanie obiektowe

Java - wprowadzenie. Programowanie Obiektowe Mateusz Cicheński

Wieloplatformowe aplikacje sieciowe. dr inż. Juliusz Mikoda mgr inż. Anna Wawszczak

SOA Web Services in Java

Enterprise JavaBeans. 1. Architektura EJB: komponenty encyjne, komponenty sesyjne, komponenty sterowane komunikatami. 2. Kontenery EJB JBoss.

Instrukcja 2 Laboratorium z Podstaw Inżynierii Oprogramowania

Polimorfizm, metody wirtualne i klasy abstrakcyjne

Multimedia JAVA. Historia

Java RMI. Dariusz Wawrzyniak 1. Podejście obiektowe do budowy systemów rozproszonych. obiekt. interfejs. kliencka. sieć

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

Kurs ASP.NET ASP.NET CORE APLIKACJE WEBOWE

Wyjątki. Streszczenie Celem wykładu jest omówienie tematyki wyjątków w Javie. Czas wykładu 45 minut.

OpenLaszlo. OpenLaszlo

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

Aplikacje webowe z wykorzystaniem Node.js oraz Express

Wykład 8: Obsługa Wyjątków

Aplikacje biznesowe Wykład dla studentów Informatyki Stosowanej

Język JAVA podstawy. wykład 2, część 2. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Instrukcja tworzenia aplikacji EE na bazie aplikacji prezentowanej na zajęciach lab.4 z PIO umożliwiająca przez sieć dostęp wielu użytkownikom.

Programowanie rozproszone w języku Java

Java wybrane technologie

Początki Javy. dr Anna Łazińska, WMiI UŁ Podstawy języka Java 1 / 8

Java Zadanie 1. Aby poprawnie uruchomić aplikację desktopową, należy zaimplementować główną metodę zapewniającą punkt wejścia do programu.

Programowanie obiektowe

JAVA EE 8. Waldemar Korłub. Narzędzia i aplikacje Java EE KASK ETI Politechnika Gdańska

Zaawansowane aplikacje internetowe laboratorium

Stanowe komponenty sesyjne

Specyfikacja techniczna. mprofi Interfejs API

Budowa aplikacji w technologii. Enterprise JavaBeans. Maciej Zakrzewicz PLOUG

Java podstawy jęyka. Wykład 2. Klasy abstrakcyjne, Interfejsy, Klasy wewnętrzne, Anonimowe klasy wewnętrzne.

Podstawy otwartych języków programowania Przechowywanie danych

Transkrypt:

JAX-RS czyli REST w Javie Adam Kędziora

Webservice Usługa sieciowa (ang. web service) komponent programowy niezależny od platformy i implementacji, dostarczający określonej funkcjonalności. SOAP,UDDI,XML,WSDL - tradycyjne usługi sieciowe

REST REpresentional State Transfer wzorzec architektury oprogramowania sieciowego w którym główną jednostką jest zasób. Klasycznym przykładem jest protokół http w swojej oryginalnej postaci i oryginalnym przeznaczeniu tak więc rest nie jest niczym nowym to powrót do pierwotnych ideii sieciowych.

Co REST nam daje? A) przenośność Usługi sieciowe opracowywane w oparciu o wsdl/soap/uddi są ciężkie do implementacji jeżeli nie skorzysta się z dodatkowych narzędzi przez co dużo trudniej zastosować je chociazby w przypdaku rynku embeded. Usługi restowe wymagają jedynie obsługi protokołu http tak do tworzenia usług jak i ich konsumpcji.

Co REST nam daje? B) skalowalność Duża zaleta usług rest wynika z przenoszenie stanu w wywołaniu http jeżeli stan jest przenoszony przy wywołaniu, nie trzeba go specjalnie trzymać na serwerze co oznacza dla programisty javy możliwość wykorzystania bezstanowych ziaren ejb co oznacza wysoką skalowalność wszerz.

REST w javie czyli JAX-RS JAX-RS jsr311 Java API for RESTful Web Services Aktualnie w wersji 1.1 specyfikacja definiuje sposoby pisania serwisów jednak nie ich konsumpcji, planowane jest to na wersję 2.0 @Path(/hello) Public class resthello{ @GET Public String sayhello(){return hello ;

REST w javie czyli jersey Jersey referencyjna implementacja JAX-RS ś.p. Sun microsystems. Referencyjna implementacja jax-rs bardzo łatwa w obsłudze: <servlet> <servlet-name>jerseyservlet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.servletcontainer</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jerseyservlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>

REST w javie czyli jersey-client Jersey posiada podprojekt bibliotekę kliencką do obsługi rest-ów Biblioteka ta jest jedną z najprzyjemniejszych jakie mialem okazję ostatnio poznać jest bardzo lekka w użyciu a jednocześnie ułatwia te rzeczy które ma ułatwiać przy pracy z http: String s = Client.create().resource("http://localhost/hello").get(String.class);

Tworzymy prosty webservice Dodajemy do poma : <dependency> <groupid>com.sun.jersey</groupid> <artifactid>jersey-server</artifactid> <version>1.1.5</version> </dependency> Do web.xml : <servlet> <servlet-name>jerseyservlet</servlet-name> <servlet-class>com.sun.jersey.spi.container.servlet.servletcontainer</servlet-class> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>jerseyservlet</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping>

Tworzymy prosty webservice Tworzymy klasę helloworld: import javax.ws.rs.get; import javax.ws.rs.path; @Path("hello") public class helloworld { @GET public String sayhello(){ return "hello";

Testujemy nasz webservice http://localhost:8080/helloworld/hello

Przekazywanie parametrów w scieżce import javax.ws.rs.get; import javax.ws.rs.path; import javax.ws.rs.pathparam; @Path("hello") public class helloworld { @GET @Path("{name/") public String sayhello(@pathparam("name") String fn){ return "hello "+fn;

Przekazywanie parametrów w parametrach wywołania import javax.ws.rs.defaultvalue; import javax.ws.rs.get; import javax.ws.rs.path; import javax.ws.rs.queryparam; @Path("hello") public class helloworld { @GET public String sayhello(@defaultvalue("kowalski") @QueryParam("name") String n){ return "hello "+n;

Negocjacja formatu zwracanego Różne aplikacje mogą oczekiwać danych w różynym formacie przeglądarka www będzie najpewniej oczekiwała text/html, natomiast skrypt javascriptowy może chcieć application/json aplikacje w javie lub w.net z dużym prawdopodobieństwem będą oczekiwać xml-a

Negocjacja formatu zwracanego import javax.ws.rs.get; import javax.ws.rs.path; import javax.ws.rs.produces; import javax.ws.rs.core.mediatype; @Path("hello") public class helloworld { @GET @Produces(MediaType.TEXT_PLAIN) public String sayhello(){ return "hello "; @GET @Produces(MediaType.TEXT_HTML) public String sayhtmlhello(){ return "<html><body><p>hello</p></body></html>";

Zwracanie własnych klas JAXB/JSON jeżeli nasza klasa posiada annotacje JAXB możemy ją bezpoścrednio zwrócić jako application/xml lub application/json, konwersja na json jest automatyczna więc zawsze warto annotować obydwa typy jako typy zwracane.

Annotacje JAXB @XmlRootElement annotację tę umieszczamy na klasie którą zwracamy. W najprostszych przypadkach to wszystko czego potrzebujemy. @XmlAttribute gdy chcemy by atrybut klasy był zapamiętany jako atrybut znacznika @XmlElement gdy chcemy by atrybut klasy był zapamietany jako dziecko znacznika @XmlJavaTypeAdapter gdy prosty przypadek nie wystarcza tj gdy natrafimy na typ którego jaxb nie umie zserializować (chociażby Map<String,String>!)

@XmlJavaTypeAdapter public class StrStrMapAdaptor extends XmlAdapter<StrStrMyMap, Map<String,String>>{ @Override public Map<String, String> unmarshal(strstrmymap v) throws Exception { Map<String, String> map = new HashMap<String,String>(); for (Iterator<StrStrKeyVal> it = v.map.iterator(); it.hasnext();) { StrStrKeyVal strstr = it.next(); map.put(strstr.key, strstr.value); return map; @Override public StrStrMyMap marshal(map<string, String> v) throws Exception { StrStrMyMap map = new StrStrMyMap(); for (Iterator<String> it = v.keyset().iterator(); it.hasnext();) { String key = it.next(); StrStrKeyVal keyval = new StrStrKeyVal(); keyval.key = key; keyval.value = v.get(key); map.map.add(keyval); return map; public static class StrStrMyMap{ @XmlElement private List<StrStrKeyVal> map = new ArrayList<StrStrKeyVal>(); @XmlType @XmlAccessorType(XmlAccessType.NONE) public static class StrStrKeyVal{ @XmlAttribute(name="key",required=true) private String key; @XmlElement private String value;

JAXB ważne uwagi JAXB nie radzi sobie z final - jest oczywiście w stanie je odczytać, ale już nie utworzyć później z tego obiekt! Jeżeli przesyłamy obiekty modelowe i chcielibyśmy mieć w nich standardowe ProperyChangeListenery wystarczy oznaczyć je jako transient!

Pisanie klienta w plain java Do pom.xml dodajemy : <dependency> <groupid>com.sun.jersey</groupid> <artifactid>jersey-client</artifactid> <version>1.1.5</version> </dependency> A naszą klasą wyjściową jest : com.sun.jersey.api.client.client I tak na prawdę puki mamy code completion to wszystko co nam potrzebne :)

Wyjątki W prawie każdej aplikacji może się zdarzyć wyjątek w restach mapuje się je na kody http. public class NotFoundMap implements ExceptionMapper<NotFound> { @Override public Response toresponse(notfound exception) { return Response.status(Response.Status.NOT_FOUND).type(MediaType.TEXT_PLAIN).entity(exception.getMessage()).build();

Wyjątki - klient try{ //Kod łączenia się z serwerem catch (UniformInterfaceException uniforminterfaceexception) { if (uniforminterfaceexception.getresponse().getstatus() == 404){ throw new PlaceNotFound(placeId); throw uniforminterfaceexception;