From bc232f56770811536359de99447e1083d968cbe5 Mon Sep 17 00:00:00 2001 From: Tobias Jordine <jordine@hdm-stuttgart.de> Date: Sun, 22 May 2022 21:51:05 +0200 Subject: [PATCH] Vorbereitung Schnittstellen --- website/assignments/Schnittstellen.md | 19 ++ website/assignments/bewertungsbogen.xlsx | Bin 19115 -> 19294 bytes website/index.html | 3 + website/lecturenotes/20220523.md | 7 + website/schnittstellen.html | 328 +++++++++++++++++++++++ 5 files changed, 357 insertions(+) create mode 100644 website/assignments/Schnittstellen.md create mode 100644 website/lecturenotes/20220523.md create mode 100644 website/schnittstellen.html diff --git a/website/assignments/Schnittstellen.md b/website/assignments/Schnittstellen.md new file mode 100644 index 0000000..a355973 --- /dev/null +++ b/website/assignments/Schnittstellen.md @@ -0,0 +1,19 @@ +# Übungen Software-Entwicklung 3: Schnittstellen (Vorläufig) + +## Ausgangslage +Nachdem wir besprochen haben, wie Sie Ihre Programmdaten persistent speichern können, können Sie nun Ihrem Projekt Schnittstellen hinzufügen, sodass Sie Daten nach "außen" zur Verfügung stellen bzw. von dort empfangen können. + +## Aufgabe +* Entscheiden Sie sich, welche Schnittstellenart (synchron/asynchron) für Ihr Projekt am besten geeignet ist. +* Erstellen Sie eine Komponente, die für die Außenschnittstelle Ihrer Anwendung zuständig ist. + * Welche Daten werden bereitgestellt? + * Welche Daten können modifiziert werden? + * Welche Daten können gesendet werden? +* Erstellen Sie die geeigneten `CRUD`-Operationen für Ihre Schnittstelle. +* Sofern Sie sich für eine REST-Schnittstelle entscheiden: Denken Sie an die korrekte Wahl der [HTTP-Verben](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) und [HTTP-Status-Codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status). + +## Tipps +* Für REST-APIs: Die Verwendung eines REST-Clients (z.B. Browser-Extensions, [Postman](https://www.postman.com), [Swagger Editor](https://editor.swagger.io), [IntelliJ](https://www.jetbrains.com/help/idea/http-client-in-product-code-editor.html#converting-curl-requests)) macht das Testen der Schnittstelle einfacher. + +## Ziele +* Ihr Projekt verfügt über eine gekapselte Schnittstellenschicht, mit der von außen auf Ihr Programm zugegriffen werden kann. \ No newline at end of file diff --git a/website/assignments/bewertungsbogen.xlsx b/website/assignments/bewertungsbogen.xlsx index 6c9225c770a67f56f72236a67395e0340e0678da..677dfe51b40e5f9240dd553c1f37979203a92a98 100644 GIT binary patch delta 4125 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 H{+a&=&)UBj delta 3908 zcmY*cXE+-Sqm7YLo0K9}h`p<3(bpa^V-z)Oq%?NzXpEwi8lh-vmD)<gs9LpJsx?}B z#cb`}5cA&edG2$+?>m3bIe*TdbI!tRvZ^eyI`f;rxb)Vp8jST#QFIH1c~3dhI}I=K zyE_f3S^jhfcN6hV7UjA}gp)w>%-5qyJKBq_shxw$CQ_Zqs-NL5aDQ{*{&v5#J}<EV z$6C<wr8+*LAO2=cSybl-%kj5cXLqj7YX?)(hGCF=NkF+(3{4G|-BpLynmGu<Y2EYP zus`YX`Zsy&6gTJtAlmhl819b}^9Sl$^Hiq6K$%{zK2aFZTikk!N4q}bv5XUIn|VY- zQa;54X40I30;?4T6U;H-aweL;>fHg#f!5%);K%kLttaA3x4Q^Ih5JO|uCW1g)-t#V z?&oblN<^{gMF{uyr#;O&wUn+feX`fvaab;%>Woq0nj{9BQ8YMb>q7Po?bzl=7Oj2t zL^dAe(a32)AB;F+G0ATn2ou9pu-FQkhrbT|aY#vDD6X*W&8Phui8UC6<pkx8aPX<B zkAy)ae|pIRb@fZfVl3u01vFmS0!u!M$z$Y4kz!u-Tyv!3GSpUGSsWnvAz|vi<Q@ai zC%V9lg%k50ZO7zbQzHR--YM?K^#r%7eaZB{8SXo>(V&0$?$3Y!YAEtsIX_|2e&sd< zRyq@&qKK^EQ^^tOn`|`C=+=8GR5nB6eJ(VnO`}yF9&$$fS{MD`&H^U5=sj>JESx^E zRX{pTmk-uqL7H0~Kvz~I&zBWw2^;DyLF<dDX?)qxM%(6Wq$b`QBRtRL5UUsD2)A1n zWEB#@bh0BiX`&c}Efn2a3;gpwu92`D_w(jmv1eMif^&B+g^(o*1o-b4!C#F{scl1j zrAO;Q1Rm{0LMb+MwMB|$l|Es}Wm|k@i@Z9h*zd8WfSRjS%z`b3IN`QGRT_$*SHDx% z>feQ~{?N2(B1kLxtPVjR(%SN>l{!}9QQ(WWe?IuHhmvXll~wV0d5SP@;;CLlo7C1h zUPM$>f54Lav_GhgxjyPCO9`eP4)XK$pz443uCylepKj6Wg_|kfe;a?Uz{;cdx$Fy` z_av^Qs^06L`_3?z?rJJz?wsKHJApzmZ>ak_dUd`nWw}N<^zQ)7<3;Oy^3!jMXIp1D zQT+V6i{CiocK4Zy&_VN9uUqqZC)+~TY?B*8YKUjZUa7skrBgX@=kNB_hU^yn^r5dT zbXf@;J930@*_?IEArV>2hk^wN_+q}JZs*M~jdkvN^XN8p6wd`wy@EO}P-IJ;A^wsF z%e>p?jS}>fHLa<JKKYm!Q5tlE1Fw?5c=@OQ)CuDPV#Q0+3p3E{HIv_VrUn26v@yIQ z9GDO=7rDwed=@yC46T{|{i?F&O#Uo6yf|TN=-46Bo!7X|jm@XwLNuUR*S2J!$Qitm ze@v8nF+Q`jt1L7UvZzWR#H@vijvD2Ja(oaBSY{WA=FPqtEH&#+$vpe|P__4V2hOC* z<ULR!&6BpPB@XJTlxMQ+8NeAjO76cKb$iMEO|R(RenFcMVVAZ`%;D)y75B=VvPn+^ zLfHj1!SBC&yaC3+kKt7$9brYVupTZ2EFpEHO6#+5_0JDd&t%tM^*oXS&li;&pwiYY zJ~{Yrm^r9`6L&UYj5HS>F|7eVi}DQu;4+mDPkHeq?nB^Bi&{FK9SQ(I8*?lGMVqE# zmDs=RiSLBetwXXC$$xhWYgd+T*0jPOdZx0HA^e`mkPG)5|Jr*3W~qN;>5#6kEc1r$ zi-I(9%ZW#gSlyZ-aB3;344vqx(8sbi7|ps5)ay1p63)&Q87NwvC_o>p_0@(a&A)Qb z%o*Is-Brvla?ovQj6SIbdcJHZMXN@#MkF#k559wYJXGRiy(1z0>#Q2MR$&Ah#96EK zZc2Rdh?Ie>Juzk;1Z_P;^b9K|dLxUBUI_V4o4&D`x`{m3xNc<XEnoUk$w)^#ULnC! zg<33amyK*`dD_6s)n=fuOr=8rR@srhLA(Z_-rxI~=yZUZ!^Usq><rYb&<6szl5iKH z$|MhXiX4tpg#L)bcu@&^U}X38OGn)I*u9}r#0^}z&L9-TYS3J>7-7IWUh=IW%ws&` zS02=Hb?gvVoBmFS-N(sBigtOrvZ8RiB~3fzyv5DR<lgeS4An%v<cd*8M$DRW4bPyp zgwvY_$IVGlMZSF@_lhbAZGSiMuMgGzF<jcfq}j{7k-y}5el~w9-`C$#h6>EX{Ecul z6oWVX_eIkj!?K+8J*6De%8lU7-c7zD65$2kS6D8D=d;S!J=39P&8*zXCX!2<#=;0M z9lp51OxU{{4Q6$ahM{Sf_454KV4^*9)>xlMdyMtGZ@WsGdUeYlx*zm_4h0AvCCu(I zT~;}gI-hTcX>Pqju~3~cV){U9ZSr`_ai^#$#Y(~hTL`C|%<6qUswmz4m%L__Aq@6K z3U;+BcXnyW2tCQ_njVV077OrsmvY%(+x>`xdYsiuF}f_%C<|L}locV{3e%xBG>npr zNS5a3GSZ%6oQI*QS47w$T$*A3un$ucWV^}sRfLq1<UhX(iHzwHXW}vuocb%xy#450 z+pqi^Mc1y;ek7>c@}#_rdA*hjo?L6{=Ld`_PNbwd&;dtZ;!@1uYE0WdC<(G%kP#IC z-QiY?ZcHQS<A=l-wE#a=R_E%uF0A@gkfp_5Z0uvoy8CDf)E^dP>~BtbYw8nD6vgw# z#{A#04iWs_5Nl*dqRcBjDSpoLMQ7d94*97#`nQm&=$DMDRhRSh$#un@Y#@&Kn#+=v z7yX_6GH;oai2<%042bx>9G68!6;~wyf(+aSF0b>S1Tn|=bQw^8-F4?+&@<759XiJq zb1dD{Wk<Hf(iS+zyF9$D$;{Nz<uT-6hIN_DOY*BWi6#WIgqCz8Je2a2_ff>Ep)BFN zOR>}_Q?J?LN(LSuNb^jbQRYM6%B>XX{Hsq*AucPwr|=64&F-K5=0>(8-)bs3bNB#p zM`+3r;I+#91udRTWR!)nGv(F~{Dg`dIY_@0e5dFa*pN+NnIkQvMf$$}6^2ZQl}58L z_Ps9<09b}%kZSDcS)W-Yrby`#G~aRE<0!j;8K0)VLQ-$oJ==q3kW!Il?{U5IIyBHV zd$x1MbB?gV)E$Vou<_4F^dGa1oCRJ>CPGpNa^>U_W}Zbj8Y)0s<E-zEdd$6IudqaD zuH75m7<jf7)LXqGwgMNQNtEi>^=&mRK$d-yFi;*GiLSqgHea$IH(<fCSq6Z&l5XuL zH;A_MR1AO~axCXczOWa?+}<Ht!vl)mc{1kRaVWuLVEr8$Wy1UN*l9%Pbk@ZmxzB9; zF$Ak;0>XWMa~EK#xU>1?XExJcj+(#I6G;C_fx_0ZXn~dxLYqEEGpsXHr0iX%8Rv}0 z_i`83hdK+<eMqkx-Jh@^kH-z59baAKOh>_vcFvQB`$-;zVdFBkj~5{kM6ad5LEf3> z1mf@G-}j?d*SRRzFSwUwj6Tg0GmJmZB`#<y88nW?=b~QtpOjs%Nn;~x<{GANN<SUY znvDU&@PpVZLl%{wBf|8wiH!9!6*lE$<?CVm2#ytPibK`0!aOw7n;Wg@=RG8e>2=?> z^I`-MZeCfKN4Y$c3#UMiX3bD+REQ;_TdU=2a!yZqv@~iZ!w%AWJL+_Z&Opg}Ig$@* zOT~{Hh+;ID(Jc&eBJZmRu#se8f%VsAI7y2}1as_tLH7RAq+zmI7Lm-{w+{|kQ_ROp zyP>~qo>g*27W3xl?j%GHoF*z3HQw^to;@QJ&`!=!_|qVKlR0C<6iqy;{ZnNZq=(s^ z?XK<QzAy@Y@x_cwx^fA8dh4&Piec*>of?ntda7RmQIv}XQ~4;bZsh#AB_W(0Q+gMV zd-N!`$cy`)1=YUdQ*!Wdj66DX&JLct*n(biC)qq64IDc7qtQ93a#zzK$?&tZ@{4mi zlMV8-FE>@q%m{%L`te8rZrGwM<#R5pp>abd9WhN{w*}VBr-ri0=W+b7u_U}|Oejm> zxR!I^tIf%8VCc6q`$ukRe|7|QM>gTN*0`D*vd^IR=CI^>T=w`LlF`=K1pa4RN)Wwf znF3vt^3W@nGyK%ft(fg`N_`C+XJF;y)_%r;FIu9J{anWFw3ZT0?qlPr5wa(}w_7{0 zyHMVGeipqmq3N+5C9c#mJYm~yl13eY4W+aFbaF|>#0w+&RW8DxHA#RSoH&9D<ubY= zh-Uqq&yAr+G!^$|Q_l~~QCtPRNHiM>oIj5hNk#Q*DAet;5vd#>_|Q$0k24+uf@r-p z2-mJ*gzKQ4^B?C|j`ydx)HoGWnG2!3O>kzXe@L|Hw`2qRM%B_xpYZ8sI+kQGDNRQf z_Pi}5x{uL~Ee@RU*>IOuX^yVs<LP*-kJIy}aK+#5#L+MsQq8_k#xg%uM`J<kRWh&g zn0p0S@z3<B!|`|d{IttUf<+Z4ABe@8FiGoE@n)CB*2r^T(DjWy0hkt?iXCrY9xQ$A zv!ng6=}fY^^lq<A$!NRnKXv}=s<<%JHz=g8ZmSA%SZrh#%FD^!z*(N{T2K_~UeXl( zzD)uM;eY5NvcIrAN|DiX4=t%GlnJ-zciF6~uvZvqVV5&Md(C7a=T&-lr#o>PuSE|X zxqLt8%+h6X7)}YKyK~^@mNw_AvIBe+GwP+0df#SY#i>@U!#oxJ&n~j7@v7m%uG6+Q zXl2`Ed&D=b_>IMsQzW$2D?+cVed142X_n9n;agva)i+XB?o-t)NTH7+91u{6`i=Sw zjbNLDXYb2SuHz!9wv7%bY9~f|vE~P=!zaOeMv~+gmQjFN3RvjjlJX%6d8}*`M;DO< zs<BBmoZs|k{}z+H9~Pz?+U)T>ej4pQED)OK)0cHdlW@{{N(iYUU6GC}u%z6bD=Gls z`kDe@2BV<71-JpgFpAv3S81tJ{@>f&)q|69V>I+t$nr5LeGM`XOozT1SvH2zKnVQr zbqfHn1O5}*7&8NLuK(YD+yDUhKWV^>0EQ&MjcG6tBL|3J%nevEe+{I`HZX#Q0^ol& zhAkNY;7twyF#ngU9ph>U1^>G*005@{;*Bxy4AsatH8D$u7UWji7zG&r4L99?N&W|c C<x*<^ diff --git a/website/index.html b/website/index.html index 2f26f96..7ddda93 100644 --- a/website/index.html +++ b/website/index.html @@ -17,6 +17,7 @@ <li><a href="maven-testing.html" target="_blank">Maven & Testing</a></li> <li><a href="container-ci-cd.html" target="_blank">Container & CI/CD</a></li> <li><a href="sql-nosql.html" target="_blank">SQL, NoSQL</a></li> + <li><a href="schnittstellen.html" target="_blank">Schnittstellen</a></li> </ul> <h3>Vorlesungnotizen</h3> @@ -27,6 +28,7 @@ <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220411.md" target="_blank">Vorlesungsnotizen - 11.04.2022</a></li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220509.md" target="_blank">Vorlesungsnotizen - 09.05.2022</a></li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220516.md" target="_blank">Vorlesungsnotizen - 16.05.2022</a></li> + <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/lecturenotes/20220523.md" target="_blank">Vorlesungsnotizen - 23.05.2022</a></li> </ul> <h3>Projekt</h3> @@ -42,6 +44,7 @@ <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Maven-Testing.md" target="_blank">Übung: Build Management & Testing</a> </li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Container-CI_CD.md" target="_blank">Übung: Container & CI/CD</a> </li> <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/sql-nosql.md" target="_blank">Übung: SQL, NoSQL</a> </li> + <li><a href="https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022vorlesung/-/blob/main/website/assignments/Schnittstellen.md" target="_blank">Übung: Schnittstellen</a> </li> </ul> <h3>Organisatorisches</h3> diff --git a/website/lecturenotes/20220523.md b/website/lecturenotes/20220523.md new file mode 100644 index 0000000..897fbb3 --- /dev/null +++ b/website/lecturenotes/20220523.md @@ -0,0 +1,7 @@ +# Vorlesungsnotizen - 23.05.2022 + +## SQL + +## NoSQL + +## Schnittstellen \ No newline at end of file diff --git a/website/schnittstellen.html b/website/schnittstellen.html new file mode 100644 index 0000000..80cb67c --- /dev/null +++ b/website/schnittstellen.html @@ -0,0 +1,328 @@ +<!DOCTYPE html> +<html> + <head> + <title>Schnittstellen</title> + <meta charset="utf-8"> + <link href="css/hdm.css" rel="stylesheet"></link> + <style> + /* yanone-kaffeesatz-regular - latin */ + @font-face { + font-family: 'Yanone Kaffeesatz'; + font-style: normal; + font-weight: 400; + src: url('fonts/yanone-kaffeesatz-v22-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/yanone-kaffeesatz-v22-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/yanone-kaffeesatz-v22-latin-regular.svg#YanoneKaffeesatz') format('svg'); /* Legacy iOS */ + } + /* noto-serif-regular - latin */ + @font-face { + font-family: 'Noto Serif'; + font-style: normal; + font-weight: 400; + src: url('fonts/noto-serif-v20-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/noto-serif-v20-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/noto-serif-v20-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/noto-serif-v20-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('fonts/noto-serif-v20-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/noto-serif-v20-latin-regular.svg#NotoSerif') format('svg'); /* Legacy iOS */ + } + /* ubuntu-mono-regular - latin */ + @font-face { + font-family: 'Ubuntu Mono'; + font-style: normal; + font-weight: 400; + src: url('fonts/ubuntu-mono-v14-latin-regular.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/ubuntu-mono-v14-latin-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/ubuntu-mono-v14-latin-regular.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-regular.woff') format('woff'), /* Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-regular.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/ubuntu-mono-v14-latin-regular.svg#UbuntuMono') format('svg'); /* Legacy iOS */ + } + /* ubuntu-mono-italic - latin */ + @font-face { + font-family: 'Ubuntu Mono'; + font-style: italic; + font-weight: 400; + src: url('fonts/ubuntu-mono-v14-latin-italic.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/ubuntu-mono-v14-latin-italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/ubuntu-mono-v14-latin-italic.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-italic.woff') format('woff'), /* Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-italic.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/ubuntu-mono-v14-latin-italic.svg#UbuntuMono') format('svg'); /* Legacy iOS */ + } + /* ubuntu-mono-700 - latin */ + @font-face { + font-family: 'Ubuntu Mono'; + font-style: normal; + font-weight: 700; + src: url('fonts/ubuntu-mono-v14-latin-700.eot'); /* IE9 Compat Modes */ + src: local(''), + url('fonts/ubuntu-mono-v14-latin-700.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */ + url('fonts/ubuntu-mono-v14-latin-700.woff2') format('woff2'), /* Super Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-700.woff') format('woff'), /* Modern Browsers */ + url('fonts/ubuntu-mono-v14-latin-700.ttf') format('truetype'), /* Safari, Android, iOS */ + url('fonts/ubuntu-mono-v14-latin-700.svg#UbuntuMono') format('svg'); /* Legacy iOS */ + } + + body { font-family: 'Noto Serif'; } + h1, h2, h3 { + font-family: 'Yanone Kaffeesatz'; + font-weight: normal; + } + .remark-code, .remark-inline-code { font-family: 'Ubuntu Mono'; } + </style> + </head> + <body> + <textarea id="source"> + +class: center, middle, first + +# Software-Entwicklung 3 + +## Schnittstellen + +--- + +# Agenda + +1. Recap +2. Synchrone Schnittstellen +3. Asynchrone Schnittstellen + +--- + +# Recap: Was haben wir in der letzten Vorlesung besprochen? + +* SQL +* NoSQL + +> Blick ins [Repository](https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022projekt) + +--- +class: center, middle +# Welche Formen der Kommunikationsbeziehungen kennen Sie in der (objektorientierten) Programmierung? + +--- +# Kommunikationsbeziehungen + +Beispiele: + +* lokale Schnittstellen + * API (lokal) +* Remote Schnittstellen + * RPC + * RESTful-APIs + * SOAP-APIs + * Messaging-APIs/Event-based APIs + +--- +# Gruppierung der Schnittstellenarten + +## Synchrone Schnittstellen + +## Asynchrone Schnittstellen + +--- +# Ablauf synchrone Schnittstelle (vereinfacht) + +## Sender +1. Verfassen einer Nachricht +2. Verpacken der Nachricht (_Marshalling_) +3. Absenden der Nachricht +4. _Warten auf Antwort_ +5. Empfangen der Antwort-Nachricht +6. Auspacken der Antwort-Nachricht +7. Verarbeiten der Antwort-Nachricht + +--- +# Ablauf synchrone Schnittstelle (vereinfacht) + +## Empfänger +1. _Warten auf eingehende Nachrichten_ +2. Empfangen der Nachricht +3. Auspacken der Nachricht +4. Verarbeiten der Nachricht +5. Verfassen der Antwort-Nachricht +6. Verpacken der Antwort-Nachricht +7. Verschicken der Antwort-Nachricht + +--- +# Beispiele für synchrone Kommunikation + +* HTTP +* SOAP +* GraphQL +* RPC (z.B. RMI, gRPC) +* REST + +--- +# Was ist REST? + +> REST: Representational State Transfer + +Softwarearchitekturstil + +--- +# Grundprinzipien + +_nach [Wikipedia, 2022](https://de.wikipedia.org/wiki/Representational_State_Transfer)_ + +* Client/Server +* Zustandslosigkeit +* Caching +* Einheitliche Schnittstelle + * Adressierbarkeit von Ressourcen + * Repräsentationen zur Veränderung von Ressourcen + * Selbstbeschreibende Nachrichten + * „Hypermedia as the Engine of Application State“ (HATEOAS) +* Mehrschichtige Systeme +* Code on Demand (optional) +--- +# REST-URIs + +> URI: Uniform Resource Identifier + +Mögliche URI-Muster: +* `<protocol>://<service-name>/<resource-type>/<resource-id>` +* `<resource-type>/<resource-id>` +* `<protocol>://<service-name>/<resource-type>/<resource-id>/<resource-details>` +* `<protocol>://<service-name>/<api-version>/<resource-type>/<resource-id>` + +Beispiele: +* `https://music-mamager.app/songs/112233` +* `https://music-mamager.app/songs/112233/play` +* `https://music-mamager.app/songs/112233/artist` +* `/v3/songs/112233/artist/json` + +--- +# REST im Einsatz + +* Verwendung auf Basis von HTTP/HTTPS +* Nutzen der [HTTP-Verben](https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods) + * `POST` + * `GET` + * `DELETE` + * `PUT` (entspricht einem Update) + * ... +* Nutzen der HTTP-Status-Codes für Antworten + * [Übersicht der HTTP-Status-Codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status) +--- +# REST-APIs mit OpenAPI 3/Swagger + +* API-Spezifikation +* API-Dokumentation +* API-Generierung +* Testumgebung + +[Petstore Demo Projekt](https://petstore.swagger.io/) + +--- +# REST mit Spring Boot (I) + +* Alternative zu `JAX-WS` +* Maven-Dependency hinzufügen (`spring-boot-starter-web`) + +```xml +<dependency> + <groupId>org.springframework.boot</groupId> + <artifactId>spring-boot-starter-web</artifactId> + <version>2.7.0</version> +</dependency> +``` +* Erstellen einer Klasse, die mit `@RestController` annotiert wird +* Annotieren der Methoden mit geeigneter HTTP-Verb Annotation (z.B. `@GetMapping`) und zuweisen des Resource-Pfads (z.B. `/songs`) +* Mapping der URL-Parameter zu Java-Parametern mit der `@RequestParam(value = "name", defaultValue = "Song 2")` + +--- +# REST mit Spring Boot (II) + +Start der Anwendung: + +```java +@SpringBootApplication +public class RestServiceApplication { + + public static void main(String[] args) { + SpringApplication.run(RestServiceApplication.class, args); + } + +} +``` +--- +# REST mit Spring Boot (III) + +_Quelle: [spring.io, "Building a RESTful Web Service", 2022](https://spring.io/guides/gs/rest-service/)_ + +```java +package com.example.restservice; + +public class Greeting { + + private final long id; + private final String content; + + public Greeting(long id, String content) { + this.id = id; + this.content = content; + } + + public long getId() { + return id; + } + + public String getContent() { + return content; + } +} +``` + +--- +# REST mit Spring Boot (IV) + +```java +package com.example.restservice; + +import java.util.concurrent.atomic.AtomicLong; + +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.RequestParam; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class GreetingController { + + private static final String template = "Hello, %s!"; + private final AtomicLong counter = new AtomicLong(); + + @GetMapping("/greeting") + public Greeting greeting(@RequestParam(value = "name", defaultValue = "World") String name) { + return new Greeting(counter.incrementAndGet(), String.format(template, name)); + } +} +``` +--- +# REST-Demo im Projekt + +> Blick ins [Repository](https://gitlab.mi.hdm-stuttgart.de/jordine/se3sose2022projekt) + +--- +class: center, middle + +# Asynchrone Kommunikationsbeziehungen + + + </textarea> + <script src="js/remark.min.js"> + </script> + <script> + var slideshow = remark.create(); + </script> + </body> +</html> \ No newline at end of file -- GitLab