מבוא ל- Akka HTTP

1. סקירה כללית

במדריך זה, בעזרת מודלי השחקנים והסטרים של Akka, נלמד כיצד להגדיר את Akka ליצירת API של HTTP המספק פעולות CRUD בסיסיות.

2. תלות Maven

כדי להתחיל, בואו נסתכל על התלות הנדרשת כדי להתחיל לעבוד עם Akka HTTP:

 com.typesafe.akka akka-http_2.12 10.0.11 com.typesafe.akka akka-stream_2.12 2.5.11 com.typesafe.akka akka-http-jackson_2.12 10.0.11 com.typesafe.akka akka-http- מבחן testkit_2.12 10.0.11 

אנו יכולים, כמובן, למצוא את הגרסה האחרונה של ספריות Akka אלה ב Maven Central.

3. יצירת שחקן

כדוגמה, נבנה API של HTTP המאפשר לנו לנהל את משאבי המשתמש. ה- API יתמוך בשתי פעולות:

  • יצירת משתמש חדש
  • טוען משתמש קיים

לפני שנוכל לספק API של HTTP, נצטרך ליישם שחקן המספק את הפעולות הדרושות לנו:

מחלקה UserActor מרחיב את AbstractActor {UserService userService פרטי = UserService חדש (); אביזרי אבזר סטטיים () {להחזיר Props.create (UserActor.class); } @Override ציבור קבל createReceive () {החזר קבלת Builder () .match (CreateUserMessage.class, handleCreateUser ()) .match (GetUserMessage.class, handleGetUser ()) .build (); } פרטי FI.UnitApply handleCreateUser () {return createUserMessage -> {userService.createUser (createUserMessage.getUser ()); שולח () .tell (חדש ActionPerformed (String.format ("המשתמש% s נוצר.", createUserMessage.getUser (). getName ())), getSelf ()); }; } פרטי FI.UnitApply handleGetUser () {return getUserMessage -> {sender (). tell (userService.getUser (getUserMessage.getUserId ()), getSelf ()); }; }}

בעיקרון, אנו מרחיבים את AbstractActor בכיתה ויישום שלה createReceive () שיטה.

בְּתוֹך createReceive (), אנחנו מיפוי סוגי הודעות נכנסות לשיטות המטפלות בהודעות מהסוג המתאים.

סוגי ההודעות הם מחלקות מיכל פשוטות לסידור עם כמה שדות המתארים פעולה מסוימת. GetUserMessage ויש לו שדה יחיד תעודת זהות של משתמש כדי לזהות את המשתמש לטעון. CreateUserMessage מכיל א מִשׁתַמֵשׁ להתנגד עם נתוני המשתמש שאנחנו צריכים כדי ליצור משתמש חדש.

בהמשך נראה כיצד לתרגם בקשות HTTP נכנסות להודעות אלה.

בסופו של דבר, אנו מאצילים את כל ההודעות לא שירות משתמש מופע, המספק את ההיגיון העסקי הדרוש לניהול אובייקטים של משתמשים קבועים.

כמו כן, שים לב ל אביזרים () שיטה. בזמן ש אביזרים () השיטה אינה הכרחית להרחבה AbstractActor, זה יהיה שימושי בהמשך בעת יצירת ה- מערכת שחקנים.

לדיון מעמיק יותר על שחקנים, עיין במבוא שלנו לשחקני עכה.

4. הגדרת נתיבי HTTP

שיש שחקן שעושה את העבודה בפועל בשבילנו, כל שנותר לנו לעשות הוא לספק API של HTTP שמאציל בקשות HTTP נכנסות לשחקן שלנו.

Akka משתמש במושג מסלולים לתיאור API של HTTP. לכל פעולה אנו זקוקים למסלול.

כדי ליצור שרת HTTP, אנו מרחיבים את מחלקת המסגרת HttpApp וליישם את מסלולים שיטה:

המחלקה UserServer מרחיבה את HttpApp {userActor final final ActorRef; פסק זמן לפסק זמן = פסק זמן חדש (Duration.create (5, TimeUnit.SECONDS)); UserServer (ActorRef userActor) {this.userActor = userActor; } @ עקוף מסלולי נתיב ציבוריים () {נתיב חזרה ("משתמשים", זה :: postUser). או Else (נתיב (קטע ("משתמשים"). קו נטוי (longSegment ()), מזהה -> מסלול (getUser (id)) )); } מסלול פרטי getUser (מזהה ארוך) {return get (() -> {CompletionStage user = PatternsCS.ask (userActor, GetUserMessage חדש (id), פסק זמן). ואז החל (obj -> (אופציונלי) obj); להחזיר onSuccess (() -> משתמש, בוצע -> {אם (ביצע.הייכנס ()) להחזיר הושלם (StatusCodes.OK, performed.get (), Jackson.marshaller ()); אחרת החזר הושלם (StatusCodes.NOT_FOUND); }); }); } מסלול פרטי postUser () {return return (post (() -> entity (Jackson.unmarshaller (User.class), user -> {CompletionStage userCreated = PatternsCS.ask (userActor, CreateUserMessage חדש (משתמש), פסק זמן). ואז החל) (obj -> (ActionPerformed) obj); return onSuccess (() -> userCreated, performed -> {return complete (StatusCodes.CREATED, performed, Jackson.marshaller ());});}))); }} 

עכשיו יש כאן כמות נכבדת של צלחת הדוד, אך שימו לב שאנחנו עוקבים אחר אותו דפוס כמו קודם פעולות מיפוי, הפעם כמסלולים. בואו נשבר את זה קצת.

בְּתוֹך getUser ()אנו פשוט עוטפים את מזהה המשתמש הנכנס בהודעה מסוג GetUserMessage ולהעביר את המסר הזה לשלנו userActor.

לאחר שהשחקן עיבד את ההודעה, onSuccess מטפל נקרא, בו אנו לְהַשְׁלִים את בקשת ה- HTTP באמצעות שליחת תגובה עם סטטוס HTTP מסוים וגוף JSON מסוים. אנו משתמשים במסדר הג'קסון כדי לסדר את התשובה שנתן השחקן למחרוזת JSON.

בְּתוֹך postUser (), אנו עושים דברים קצת אחרת, מכיוון שאנו מצפים לגוף JSON בבקשת HTTP. אנו משתמשים ב- יֵשׁוּת() שיטה למפות את גוף ה- JSON הנכנס לא מִשׁתַמֵשׁ אובייקט לפני שעוטפים אותו לא CreateUserMessage ולהעביר את זה לשחקן שלנו. שוב, אנו משתמשים בג'קסון כדי למפות בין ג'אווה ל- JSON ולהיפך.

מאז HttpApp מצפה מאיתנו לספק יחיד מַסלוּל אובייקט, אנו משלבים את שני המסלולים לאחד בתוך ה- מסלולים שיטה. כאן, אנו משתמשים ב- נָתִיב הנחיה לספק סוף סוף את נתיב ה- URL שבו ה- API שלנו אמור להיות זמין.

אנו מחייבים את המסלול המסופק על ידי postUser () אל השביל / משתמשים. אם הבקשה הנכנסת אינה בקשת POST, Akka יעבור אוטומטית ל- אחרת להסתעף ולצפות שהדרך תהיה / משתמשים / ושיטת ה- HTTP להיות GET.

אם שיטת ה- HTTP היא GET, הבקשה תועבר אל ה- getUser () מַסלוּל. אם המשתמש לא קיים, Akka יחזיר את מצב HTTP 404 (לא נמצא). אם השיטה אינה POST ולא GET, Akka יחזיר את מצב HTTP 405 (שיטה אינה מותרת).

למידע נוסף על אופן הגדרת מסלולי HTTP עם Akka, עיין במסמכי Akka.

5. הפעלת השרת

לאחר שיצרנו HttpApp יישום כמו לעיל, אנו יכולים להפעיל את שרת ה- HTTP שלנו עם מספר שורות קוד:

main main static public (String [] args) זורק Exception {ActorSystem system = ActorSystem.create ("userServer"); ActorRef userActor = system.actorOf (UserActor.props (), "userActor"); שרת UserServer = UserServer חדש (userActor); server.startServer ("localhost", 8080, מערכת); }

אנחנו פשוט יוצרים מערכת שחקנים עם שחקן יחיד מסוג UserActor והפעל את השרת מארח מקומי.

6. מסקנה

במאמר זה למדנו על היסודות של Akka HTTP עם דוגמה המראה כיצד להגדיר שרת HTTP ולחשוף נקודות קצה ליצירת וטעינה של משאבים, בדומה ל- API של REST.

כרגיל, את קוד המקור המוצג כאן ניתן למצוא ב- GitHub.


$config[zx-auto] not found$config[zx-overlay] not found