ממשק API של לקוח RESTEasy

1. הקדמה

במאמר הקודם התמקדנו ב- מנוחה יישום צד השרת של JAX-RS 2.0.

JAX-RS 2.0 מציג ממשק API חדש של לקוח כדי שתוכל להגיש בקשות HTTP לשירותי האינטרנט RESTful המרוחקים שלך. ג'רזי, Apache CXF, Restlet ו- RESTEasy הם רק קבוצת משנה של היישומים הפופולריים ביותר.

במאמר זה נחקור כיצד לצרוך את ממשק API של REST על ידי שליחת בקשות עם ממשק API RESTEasy.

2. הגדרת פרויקט

הוסף את שלך pom.xml התלות הבאה:

 3.0.14.Final org.jboss.resteasy client-resteasy-$ {resteasy.version} ... 

3. קוד צד לקוח

יישום הלקוח הוא די, מורכב משלושה שיעורים עיקריים:

    • לָקוּחַ
    • WebTarget
    • תְגוּבָה

ה לָקוּחַ ממשק הוא בונה של WebTarget מקרים.

WebTarget מייצג כתובת URL או תבנית URL מובחנים שממנה תוכל לבנות עוד משאבי-משנה WebTargets או להפעיל בקשות.

יש באמת שתי דרכים ליצור לקוח:

  • הדרך הסטנדרטית, באמצעות org.jboss.resteasy.client.ClientRequest
  • RESTeasy Proxy Framework: באמצעות ResteasyClientBuilder מעמד

אנו נתמקד כאן במסגרת RESTEasy Proxy Framework.

במקום להשתמש בהערות JAX-RS למיפוי בקשה נכנסת לשיטת RESTFul Web Service שלך, מסגרת הלקוח בונה בקשת HTTP בה היא משתמשת להפעלת שירות RESTful מרוחק.

אז בואו נתחיל לכתוב ממשק ג'אווה ולהשתמש בהערות JAX-RS על השיטות ועל הממשק.

3.1. ה שירותים לקוחות מִמְשָׁק

@Path ("/ films") ממשק ציבורי ServicesInterface {@GET @Path ("/ getinfo") @Produces ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) סרט movieByImdbId (@QueryParam ("imdbId") String imdbId) @POST @ Path ("/ addmovie") @ Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) תגובה addMovie (סרט סרט); @PUT @Path ("/ updatemovie") @Consumes ({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML}) עדכון תגובה סרט (סרט סרט); @ DELETE @ Path ("/ deletemovie") תגובה deleteMovie (@QueryParam ("imdbId") מחרוזת imdbId); } 

3.2. כיתת הסרט

@XmlAccessorType (XmlAccessType.FIELD) @ XmlType (name = "movie", propOrder = {"imdbId", "title"}) סרט ברמה ציבורית {מוגן מחרוזת imdbId; כותרת מחרוזת מוגנת; // גטרים וקובעים}

3.3. יצירת הבקשה

כעת ניצור לקוח פרוקסי שבו נוכל לצרוך את ה- API:

TransformerImdbId מחרוזת = "tt0418279"; TransformerMovie סרט = סרט חדש ("tt0418279", "שנאי 2"); נתיב מחרוזת סופי = "//127.0.0.1:8080/RestEasyTutorial/rest"; לקוח ResteasyClient = ResteasyClientBuilder חדש (). Build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (path)); פרוקסי ServicesInterface = target.proxy (ServicesInterface.class); // תגובה POST movieResponse = proxy.addMovie (transformerMovie); System.out.println ("קוד HTTP:" + moviesResponse.getStatus ()); moviesResponse.close (); // GET סרטי סרטים = proxy.movieByImdbId (transformerImdbId); // PUT transformerMovie.setTitle ("שנאי 4"); moviesResponse = proxy.updateMovie (transformerMovie); moviesResponse.close (); // מחק movieResponse = proxy.deleteMovie (batmanMovie.getImdbId ()); moviesResponse.close (); 

שים לב שממשק ה- API של לקוח RESTEasy מבוסס על אפאצ'י HttpClient.

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

לסיום, שים לב כיצד אנו עובדים ישירות עם ה- DTO - איננו מתמודדים עם ההיגיון המרשל / לא מרשל וממנו ג'סון אוֹ XML; שקורה מאחורי הקלעים באמצעות JAXB אוֹ ג'קסון מאז סרט הכיתה הוסרה כראוי.

3.4. יצירת הבקשה עם מאגר חיבורים

הערה אחת מהדוגמה הקודמת הייתה שיש לנו רק חיבור אחד זמין. אם - למשל, אנו מנסים לעשות:

תגובה batmanResponse = proxy.addMovie (batmanMovie); שנאי תגובה Response = proxy.addMovie (transformerMovie); 

בלי להפעיל סגור() עַל תגובה באטמן - יוצא מן הכלל חריג עם ביצוע השורה השנייה:

java.lang.IllegalStateException: שימוש לא חוקי ב- BasicClientConnManager: החיבור עדיין מוקצה. הקפד לשחרר את החיבור לפני הקצאת חיבור אחר. 

שוב - זה פשוט קורה בגלל ברירת המחדל HttpClient משמש על ידי RESTEasy הוא org.apache.http.impl.conn.SingleClientConnManager - שכמובן רק הופך חיבור יחיד לזמין.

עכשיו - כדי לעקוף את המגבלה הזו - RestEasyClient יש ליצור מופע באופן שונה (עם מאגר חיבורים):

PoolingHttpClientConnectionManager cm = חדש PoolingHttpClientConnectionManager (); CloseableHttpClient httpClient = HttpClients.custom (). SetConnectionManager (cm) .build (); cm.setMaxTotal (200); // הגדל את החיבור הכולל המקסימלי ל- 200 ס"מ. SetDefaultMaxPerRoute (20); // הגדל את החיבור המקסימלי המוגדר כברירת מחדל לכל מסלול ל- 20 ApacheHttpClient4Engine engine = ApacheHttpClient4Engine חדש (httpClient); לקוח ResteasyClient = ResteasyClientBuilder חדש (). HttpEngine (מנוע) .build (); ResteasyWebTarget target = client.target (UriBuilder.fromPath (path)); פרוקסי ServicesInterface = target.proxy (ServicesInterface.class);

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

4. מסקנה

במדריך מהיר זה הצגנו את RESTEasy Proxy Framework ובנינו איתו ממשק API לקוח סופר פשוט.

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

הדוגמה המשמשת במאמר זה זמינה כפרויקט לדוגמא ב- GitHub.


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