בקשת הודעה על RestTemplate עם JSON

REST למעלה

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס

1. הקדמה

במדריך מהיר זה אנו מדגימים כיצד להשתמש ב- Spring RestTemplate לבצע בקשות POST למשלוח תוכן JSON.

2. הגדרת הדוגמא

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

אדם בכיתה ציבורית {מזהה שלם פרטי; שם מחרוזת פרטי; // קונסטרוקטור סטנדרטי, גטרים, סטרים}

לעבוד עם אדם אובייקטים, נוסיף a PersonService ממשק ויישום בשתי שיטות:

ממשק ציבורי PersonService {אדם ציבורי saveUpdatePerson (אדם אישי); אדם ציבורי findPersonById (מספר שלם); }

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

3. התקנת REST API

בואו נגדיר REST API פשוט עבורנו אדם מעמד:

@PostMapping (value = "/ createPerson", צורכת = "application / json", מייצר = "application / json") אדם ציבורי createPerson (@RequestBody אדם אדם) {return personService.saveUpdatePerson (person); } @PostMapping (value = "/ updatePerson", consumes = "application / json", מייצר = "application / json") אדם אישי updatePerson (@RequestBody אדם אדם, תגובה HttpServletResponse) {respons.setHeader ("מיקום", ServletUriComponentsBuilder. fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ()); להחזיר את personService.saveUpdatePerson (אדם); }

זכור, אנו רוצים לפרסם את הנתונים בפורמט JSON. על מנת, הוספנו את צורכת תכונה ב @ פוסט מיפוי הערה עם הערך של "יישום / json" לשתי השיטות.

באופן דומה, הגדרנו את מייצר תכונה ל- "application / json" כדי לומר ל- Spring שאנחנו רוצים את גוף התגובה בפורמט JSON.

הערנו את אדם פרמטר עם @ בקשת גוף ביאור לשתי השיטות. זה יגיד לאביב כי אדם האובייקט יהיה קשור לגוף של HTTP בַּקָשָׁה.

לבסוף, שתי השיטות מחזירות א אדם אובייקט שיהיה קשור לגוף התגובה. נציין כי נרשום את שיעור ה- API שלנו עם @ RestController להערות על כל שיטות ה- API באמצעות מוסתר @ResponseBody ביאור.

4. שימוש RestTemplate

עכשיו אנחנו יכולים לכתוב כמה בדיקות יחידה כדי לבדוק את שלנו אדם ממשק API של REST. פה, ננסה לשלוח בקשות POST אל אדם API באמצעות שיטות ה- POST שמספקת ה- RestTemplate: postForObject, postForEntity, ו postForLocation.

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

@BeforeClass חלל סטטי ציבורי runBeforeAllTestMethods () {createPersonUrl = "// localhost: 8082 / spring-rest / createPerson"; updatePersonUrl = "// localhost: 8082 / spring-rest / updatePerson"; restTemplate = RestTemplate חדש (); כותרות = HttpHeaders חדשים (); headers.setContentType (MediaType.APPLICATION_JSON); personJsonObject = JSONObject חדש (); personJsonObject.put ("id", 1); personJsonObject.put ("שם", "ג'ון"); }

מלבד שיטת התקנה זו, שים לב שנתייחס למפות הבא כדי להמיר את מחרוזת JSON ל- JSONNode אובייקט במבחני היחידות שלנו:

סופי פרטי ObjectMapper objectMapper = ObjectMapper חדש ();

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

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

4.1. מפרסם JSON עם postForObject

RestTemplateשל postForObject השיטה יוצרת משאב חדש על ידי פרסום אובייקט בתבנית ה- URI הנתונה. זה מחזיר את התוצאה כהמרה אוטומטית לסוג שצוין ב- תגובה סוג פָּרָמֶטֶר.

בואו נגיד שאנחנו רוצים להגיש בקשת POST למערכת שלנו אדם API ליצירת חדש אדם התנגד והחזיר את האובייקט החדש שנוצר בתגובה.

ראשית, אנו בונים את בַּקָשָׁה אובייקט מהסוג HttpEntity מבוסס על ה personJsonObject והכותרות המכילות את סוג תוכן. זה מאפשר ל postForObject שיטה למשלוח גוף בקשת JSON:

@Test ציבור בטל givenDataIsJson_whenDataIsPostedByPostForObject_thenResponseBodyIsNotNull () זורק IOException {HttpEntity בקשה = HttpEntity חדש (personJsonObject.toString (), כותרות); מחרוזת personResultAsJsonStr = restTemplate.postForObject (createPersonUrl, בקשה, String.class); שורש JsonNode = objectMapper.readTree (personResultAsJsonStr); assertNotNull (personResultAsJsonStr); assertNotNull (שורש); assertNotNull (root.path ("שם"). asText ()); }

ה postForObject () שיטה מחזירה את גוף התגובה כ- חוּט סוּג.

אנו יכולים גם להחזיר את התגובה כ- אדם אובייקט על ידי הגדרת ה- תגובה סוג פָּרָמֶטֶר:

אדם אדם = restTemplate.postForObject (createPersonUrl, בקשה, Person.class); assertNotNull (אדם); assertNotNull (person.getName ());

למעשה, שיטת מטפל הבקשות שלנו תואמת את ה- createPersonUrl URI מייצר את גוף התגובה בפורמט JSON.

אבל זו לא מגבלה עבורנו - postForObject מסוגל להמיר באופן אוטומטי את גוף התגובה לסוג ה- Java המבוקש (למשל. חוּט, אדם) שצוין ב- תגובה סוג פָּרָמֶטֶר.

4.2. מפרסם JSON עם postForEntity

לְעוּמַת postForObject (), postForEntity () מחזיר את התגובה כ- תגובה תגובה לְהִתְנַגֵד. מלבד זאת, שתי השיטות עושות את אותה העבודה.

בואו נגיד שאנחנו רוצים להגיש בקשת POST לנו אדם API ליצירת חדש אדם התנגד והחזיר את התגובה כ- תגובה תגובה.

אנחנו יכולים לעשות שימוש ב- postForEntity שיטה ליישום זה:

@Test ציבור בטל givenDataIsJson_whenDataIsPostedByPostForEntity_thenResponseBodyIsNotNull () זורק IOException {HttpEntity בקשה = HttpEntity חדש (personJsonObject.toString (), כותרות); ResponseEntity responseEntityStr = restTemplate. postForEntity (createPersonUrl, בקשה, String.class); שורש JsonNode = objectMapper.readTree (responseEntityStr.getBody ()); assertNotNull (responseEntityStr.getBody ()); assertNotNull (root.path ("שם"). asText ()); }

דומה ל postForObject, postForEntity יש את תגובה סוג פרמטר להמרת גוף התגובה לסוג Java המבוקש.

כאן הצלחנו להחזיר את גוף התגובה כ- תגובה תגובה.

אנו יכולים גם להחזיר את התגובה כ- תגובה תגובה אובייקט על ידי הגדרת ה- תגובה סוג פרמטר ל Person.class:

ResponseEntity responseEntityPerson = restTemplate. postForEntity (createPersonUrl, בקשה, Person.class); assertNotNull (responseEntityPerson.getBody ()); assertNotNull (responseEntityPerson.getBody (). getName ());

4.3. מפרסם JSON עם postForLocation

דומה ל postForObject ו postForEntity שיטות, postForLocation יוצר גם משאב חדש על ידי פרסום האובייקט הנתון ל- URI הנתון. ההבדל היחיד הוא שהוא מחזיר את הערך של ה- מקום כּוֹתֶרֶת.

כזכור, כבר ראינו כיצד להגדיר את מקום כותרת של תגובה אצלנו updatePerson שיטת REST API לעיל:

response.setHeader ("מיקום", ServletUriComponentsBuilder.fromCurrentContextPath () .path ("/ findPerson /" + person.getId ()). toUriString ());

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

אנו יכולים ליישם זאת באמצעות postForLocation שיטה:

@Test הציבור בטל givenDataIsJson_whenDataIsPostedByPostForLocation_thenResponseBodyIsTheLocationHeader () זורק JsonProcessingException {HttpEntity בקשה = HttpEntity חדש (personJsonObject.toString (), כותרות); URI locationHeader = restTemplate.postForLocation (updatePersonUrl, בקשה); assertNotNull (locationHeader); }

5. מסקנה

במאמר זה בדקנו כיצד להשתמש RestTemplate לבצע בקשת POST עם JSON.

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

REST תחתון

רק הכרזתי על החדש למד אביב קורס, המתמקד ביסודות האביב 5 ומגף האביב 2:

>> בדוק את הקורס