מדריך לאירועים
1. סקירה כללית
Unirest היא ספריית לקוח HTTP קלה מ- Mashape. יחד עם Java, זה זמין גם עבור Node.js, .Net, Python, Ruby וכו '.
לפני שנקפוץ, שים לב שנשתמש ב- mocky.io לכל בקשות ה- HTTP שלנו כאן.
2. הגדרת Maven
כדי להתחיל, בואו הוסף תחילה את התלות הדרושה:
com.mashape.unirest unirest-java 1.4.9
בדוק את הגרסה האחרונה כאן.
3. בקשות פשוטות
בואו נשלח בקשת HTTP פשוטה להבנת הסמנטיקה של המסגרת:
@Test ציבורי בטל צריךReturnStatusOkay () {HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154"). כותרת ("קבל", "application / json"). QueryString ("apiKey", " 123 ") .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (200, jsonResponse.getStatus ()); }
שימו לב שממשק ה- API שוטף, יעיל ודי קל לקריאה.
אנו מעבירים כותרות ופרמטרים עם ה- כּוֹתֶרֶת() ו שדות () ממשקי API.
והבקשה מופעלת על asJson () שיחת שיטה; יש לנו כאן גם אפשרויות אחרות, כגון asBinary (), asString () ו asObject ().
כדי להעביר מספר כותרות או שדות, אנו יכולים ליצור מפה ולהעביר אותם אליה כותרות (כותרות מפה) ו . שדות (שדות מפה) בהתאמה:
בטל ציבורי @Test צריךReturnStatusAccepted () {כותרות מפה = HashMap חדש (); headers.put ("קבל", "יישום / json"); headers.put ("הרשאה", "נושא 5a9ce37b3100004f00ab5154"); שדות מפה = HashMap חדש (); fields.put ("שם", "סם באלדונג"); fields.put ("id", "PSP123"); HttpResponse jsonResponse = Unirest.put ("// www.mocky.io/v2/5a9ce7853100002a00ab515e"). כותרות (כותרות). שדות (שדות) .asJson (); assertNotNull (jsonResponse.getBody ()); assertEquals (202, jsonResponse.getStatus ()); }
3.1. העברת פראמרי שאילתות
להעביר נתונים כשאילתה חוּט, נשתמש ב- queryString () שיטה:
HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154") .queryString ("apiKey", "123")
3.2. שימוש ב Params Path
להעברת פרמטרים של כתובות אתרים, אנו יכולים להשתמש ב- routeParam () שיטה:
HttpResponse jsonResponse = Unirest.get ("// www.mocky.io/v2/5a9ce37b3100004f00ab5154/{userId}") .routeParam ("userId", "123")
שם מציין המיקום של הפרמטר חייב להיות זהה לארגומנט הראשון לשיטה.
3.3. בקשות עם גוף
אם בקשתנו דורשת מחרוזת / גוף JSON, אנו מעבירים אותה באמצעות ה- גוּף() שיטה:
@Test ציבורי בטל givenRequestBodyWhenCreatedThenCorrect () {HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d"). גוף ("{\" name \ ": \" סם באלדונג \ ", \" עיר \ ": \" ויאנה \ "}"). asJson (); assertEquals (201, jsonResponse.getStatus ()); }
3.4. ממפה אובייקטים
על מנת להשתמש ב- asObject () אוֹ גוּף() בבקשה עלינו להגדיר את מיפוי האובייקטים שלנו. לשם פשטות נשתמש במפת האובייקטים של ג'קסון.
בואו קודם להוסיף את התלות הבאות ל pom.xml:
com.fasterxml.jackson.core jackson-databind 2.9.4
השתמש תמיד בגרסה האחרונה ב- Maven Central.
עכשיו בואו להגדיר את המפה שלנו:
Unirest.setObjectMapper (ObjectMapper חדש () {com.fasterxml.jackson.databind.ObjectMapper mapper = com.fasterxml.jackson.databind.ObjectMapper חדש) (public; public String writeValue (Value Object) {return mapper.writeValueAsString (value);} T readValue ציבורי (ערך מחרוזת, Class valueType) {mapper.readValue return (value, valueType);}});
ציין זאת setObjectMapper () צריך להתקשר רק פעם אחת, להגדרת המפה; לאחר הגדרת מופע המיפוי, הוא ישמש לכל הבקשות והתגובות.
בואו נבדוק כעת את הפונקציונליות החדשה באמצעות מותאם אישית מאמר לְהִתְנַגֵד:
@ מבחן בטל פומבי givenArticleWhenCreatedThenCorrect () {Article article = מאמר חדש ("ID1213", "מדריך למנוחה", "baeldung"); HttpResponse jsonResponse = Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d"). גוף (מאמר) .asJson (); assertEquals (201, jsonResponse.getStatus ()); }
4. שיטות בקשה
בדומה לכל לקוח HTTP, המסגרת מספקת שיטות נפרדות לכל פועל HTTP:
הודעה:
Unirest.post ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
לָשִׂים:
Unirest.put ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
לקבל:
Unirest.get ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
לִמְחוֹק:
Unirest.delete ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
תיקון:
Unirest.patch ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
אפשרויות:
Unirest.options ("// www.mocky.io/v2/5a9ce7663100006800ab515d")
5. שיטות תגובה
לאחר שנקבל את התגובה, בוא לבדוק את קוד הסטטוס והודעת הסטטוס:
// ... jsonResponse.getStatus () // ...
חלץ את הכותרות:
// ... jsonResponse.getHeaders (); // ...
קבל את גוף התגובה:
// ... jsonResponse.getBody (); jsonResponse.getRawBody (); // ...
שימו לב לכך, ה getRawBody (), מחזיר זרם של גוף התגובה שלא נותח, ואילו ה- getBody () מחזיר את הגוף המנותח, באמצעות מיפוי האובייקטים שהוגדר בסעיף הקודם.
6. טיפול בבקשות אסינכרוניות
ל- Unirest יש גם את היכולת לטפל בבקשות אסינכרוניות - באמצעות java.util.concurrent.Future ושיטות להתקשרות חוזרת:
@ מבחן ציבורי בטל כאשר AysncRequestShouldReturnOk () {עתיד future = Unirest.post ("//www.mocky.io/v2/5a9ce37b3100004f00ab5154?mocky-delay=10000ms"). כותרת ("קבל", "application / json") .asJsonAsync (התקשרות חוזרת () (הריק הציבורי נכשל (UnirestException e) {// עשה משהו אם הבקשה נכשלה} הושלם הריק הציבורי (תגובת HttpResponse) {// עשה משהו אם הבקשה הצליחה} הריק הציבורי בוטל () {// עשה משהו אם הבקשה בוטלה}}) ; assertEquals (200, future.get (). getStatus ()); }
ה com.mashape.unirest.http.async.Callback הממשק מספק שלוש שיטות, נִכשָׁל(), מבוטל() ו הושלם ().
עקוף את השיטות לביצוע הפעולות הדרושות בהתאם לתגובה.
7. העלאות קבצים
כדי להעלות או לשלוח קובץ כחלק מהבקשה, העבירו a java.io. קובץ אובייקט כשדה עם קובץ שם:
@Test ציבורי בטל givenFileWhenUploadedThenCorrect () {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d"). שדה ("קובץ", קובץ חדש ("/ path / to / file")). asJson (); assertEquals (201, jsonResponse.getStatus ()); }
אנחנו יכולים גם להשתמש ByteStream:
@ מבחן חלל ציבורי givenByteStreamWhenUploadedThenCorrect () {try (InputStream inputStream = FileInputStream חדש (קובץ חדש ("/ path / to / file / artcile.txt"))) {byte [] bytes = byte new [inputStream.available ()]; inputStream.read (בתים); HttpResponse jsonResponse = Unirest.post ("//www.mocky.io/v2/5a9ce7663100006800ab515d"). שדה ("קובץ", בתים, "article.txt") .asJson (); assertEquals (201, jsonResponse.getStatus ()); }}
או השתמש בזרם הקלט ישירות והוסף את ה- ContentType.APPLICATION_OCTET_STREAM כטענה השנייה ב שדות () שיטה:
@Test ציבורי בטל givenInputStreamWhenUploadedThenCorrect () {נסה (InputStream inputStream = FileInputStream חדש (קובץ חדש ("/ path / to / file / artcile.txt"))) {HttpResponse jsonResponse = Unirest.post ("//www.mocky.io / v2 / 5a9ce7663100006800ab515d ") .field (" file ", inputStream, ContentType.APPLICATION_OCTET_STREAM," article.txt "). asJson (); assertEquals (201, jsonResponse.getStatus ()); }}
8. תצורות Unirest
המסגרת תומכת גם בתצורות אופייניות של לקוח HTTP כמו איגום חיבורים, פסק זמן, כותרות גלובליות וכו '.
בואו נקבע את מספר החיבורים ומספר החיבורים המרבי לכל מסלול:
Unirest.setConcurrency (20, 5);
הגדר פסק זמן לחיבור ושקע:
Unirest.setTimeouts (20000, 15000);
שים לב שערכי הזמן הם באלפיות השנייה.
עכשיו בואו נקבע כותרות HTTP לכל הבקשות שלנו:
Unirest.setDefaultHeader ("X-app-name", "baeldung-unirest"); Unirest.setDefaultHeader ("מזהה X- בקשה", "100004f00ab5");
אנו יכולים לנקות את הכותרות הגלובליות בכל עת:
Unirest.clearDefaultHeaders ();
בשלב מסוים, ייתכן שנצטרך להגיש בקשות דרך שרת proxy:
Unirest.setProxy (HttpHost חדש ("localhost", 8080));
היבט חשוב שכדאי להיות מודע אליו הוא סגירה או יציאה מהיישום בחן. Unirest מוליך לולאת אירוע רקע כדי לטפל בפעולות, עלינו לסגור את הלולאה הזו לפני היציאה מהיישום שלנו:
Unirest. shutdown ();
9. מסקנה
במדריך זה התמקדנו במסגרת לקוח HTTP קל משקל - Unirest. עבדנו עם כמה דוגמאות פשוטות, גם במצבים סינכרוניים אך גם לא סינכרון.
לבסוף, השתמשנו גם בכמה תצורות מתקדמות - כגון איגום חיבורים, הגדרות פרוקסי וכו '.
כרגיל, קוד המקור זמין ב- GitHub.