JAX-RS הוא רק ממשק API!

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

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

ניתן להטמיע ממשק API RESTful בג'אווה במספר דרכים: אתה יכול להשתמש ב- Spring, JAX-RS, או פשוט לכתוב סרבלטים חשופים משלך אם אתה טוב ואמיץ מספיק. כל מה שאתה צריך זה היכולת לחשוף שיטות HTTP - כל השאר הוא איך אתה מארגן אותן וכיצד אתה מנחה את הלקוח בעת ביצוע שיחות ל- API שלך.

כפי שאתה יכול להבין מהכותרת, מאמר זה יכסה את JAX-RS. אבל מה פירוש "רק API"? המשמעות היא שההתמקדות כאן היא בבירור הבלבול בין JAX-RS ליישומיו ובהצגת דוגמה לאיך נראה יישום אינטרנט תקין של JAX-RS.

2. הכללה ב- Java EE

JAX-RS אינו אלא מפרט, סט ממשקים והערות המוצעים על ידי Java EE. ואז, כמובן, יש לנו את היישומים; חלק מהידועים יותר הם RESTEasy ו- Jersey.

כמו כן, אם אי פעם תחליט לבנות שרת יישומים תואם JEE, החבר'ה מאורקל יגידו לך שבין הרבה דברים אחרים, השרת שלך צריך לספק יישום JAX-RS לשימוש האפליקציות הפרוסות. לכן היא נקראת Java Enterprise Edition פּלַטפוֹרמָה.

דוגמא טובה נוספת למפרט ולהטמעה היא JPA ו- Hibernate.

2.1. מלחמות קלות משקל

אז איך כל זה עוזר לנו, המפתחים? העזרה היא בכך שניתנים לפריסה שלנו יכולים וצריכים להיות דקים מאוד, ומאפשרים לשרת היישומים לספק את הספריות הדרושות. זה חל גם בעת פיתוח ממשק API RESTful: החפץ הסופי לא אמור להכיל שום מידע על יישום ה- JAX-RS המשומש.

בטח, אנו יכולים לספק את היישום (להלן מדריך ל- RESTeasy). אך אז איננו יכולים לקרוא ליישום שלנו יותר "אפליקציית Java EE". אם מחר מישהו יבוא ויגיד "אוקי, הגיע הזמן לעבור ל- Glassfish או Payara, JBoss הפך יקר מדי!", אולי נוכל לעשות את זה, אבל זו לא תהיה עבודה קלה.

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

2.2. דע תמיד את השרת שלך

אמרנו עד כה שעלינו לנצל את הפלטפורמה המוצעת לנו.

לפני שנחליט להשתמש בשרת, עלינו לראות איזה יישום של JAX-RS (שם, ספק, גרסה ובאגים ידועים) הוא מספק, לפחות עבור סביבות ייצור. לדוגמא, דג זכוכית מגיע עם ג'רזי, ואילו Wildfly או Jboss מגיעים עם RESTEasy.

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

3. דוגמא

אם אתה רוצה להתחיל לשחק עם JAX-RS, הדרך הקצרה ביותר היא: הכן פרויקט Maven webapp עם התלות הבאה ב pom.xml:

 javax javaee-api 7.0 מסופק 

אנו משתמשים ב- JavaEE 7 מכיוון שכבר יש המון שרתי יישומים המיישמים אותו. צנצנת ה- API הזו מכילה את ההערות שבהן אתה צריך להשתמש, הממוקמות בחבילה javax.ws.rs. מדוע היקף "מסופק"? מכיוון שגם הצנצנת הזו לא צריכה להיות במבנה הסופי - אנו זקוקים לה בזמן הקומפילציה והיא מסופקת על ידי השרת למשך זמן הריצה.

לאחר הוספת התלות, ראשית עלינו לכתוב את מחלקת הכניסה: מחלקה ריקה המתארכת javax.ws.rs.core.Application ומבואר עם javax.ws.rs.ApplicationPath:

@ApplicationPath ("/ api") מחלקה ציבורית RestApplication מרחיב את היישום {} 

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

לאחר מכן, בואו נראה משאב:

@Path ("/ notifications") Class public NotificationsResource {@GET @Path ("/ ping") תגובה ציבורית פינג () {return Response.ok (). ישות ("שירות מקוון"). Build (); } @GET @Path ("/ get / {id}") @Produces (MediaType.APPLICATION_JSON) תגובה תגובה ציבורית getNotification (@PathParam ("id") מזהה int) {return Response.ok (). , "ג'ון", "הודעת בדיקה")) .build (); } @ POST @ Path ("/ post /") @ Consumes (MediaType.APPLICATION_JSON) @Produces (MediaType.APPLICATION_JSON) ציבורי תגובה הודעה הודעה (הודעה על התראה) {החזרה Response.status (201). אחדות (הודעה). בניין () ; }}

יש לנו נקודת קצה פינג פשוטה להתקשר ולבדוק אם האפליקציה שלנו פועלת, GET ו- POST לקבלת הודעה (זה רק POJO עם תכונות פלוס גטרים וקובעים).

פרוס מלחמה זו על כל שרת יישומים המיישם את JEE7 והפקודות הבאות יעבדו:

תלתל // localhost: 8080 / simple-jaxrs-ex / api / notifications / ping / curl // localhost: 8080 / simple-jaxrs-ex / api / notifications / get / 1 curl -X POST -d '{"id" : 23, "text": "lorem ipsum", "שם משתמש": "johana"} '// localhost: 8080 / simple-jaxrs-ex / api / notifications / post / --header "סוג תוכן: יישום / json "

היכן ש- simple-jaxrs-ex הוא שורש ההקשר של ה- webapp.

זה נבדק עם Glassfish 4.1.0 ו- Wildfly 9.0.1 Final. שים לב ששתי הפקודות האחרונות לא יעבדו עם Glassfish 4.1.1 בגלל הבאג הזה. ככל הנראה מדובר בבעיה ידועה בגרסת Glassfish זו, בנוגע לסידור של JSON (אם תצטרך להשתמש בגרסת שרת זו, תצטרך לנהל לבשל את JSON)

4. מסקנה

בסוף מאמר זה, רק זכור כי JAX-RS הוא ממשק API רב עוצמה ורוב (אם לא כל) הדברים שאתה זקוק להם כבר מיושמים על ידי שרת האינטרנט שלך. אין צורך להפוך את הפריסה שלך לערימת ספריות בלתי ניתנת לניהול.

כתב זה מציג דוגמה פשוטה והדברים עשויים להסתבך יותר. למשל, כדאי לך לכתוב מרשלים משלך. כשצריך את זה, חפש מדריכים הפותרים את הבעיה שלך עם JAX-RS, לא עם ג'רזי, Resteasy או יישום קונקרטי אחר. סביר מאוד להניח שניתן לפתור את הבעיה שלך בהערה אחת או שתיים.