קבלת ואימות נתוני תגובה באבטחת REST

REST למעלה

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

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

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

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

2. הגדרת כיתת הבדיקה

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

בהתבסס על ההתקנה הקיימת הזו, הוספנו בקר REST פשוט, AppController, שקוראת פנימית לשירות, AppService. נשתמש בשיעורים אלה בדוגמאות הבדיקה שלנו.

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

ראשית, בואו ניצור את השלד שלנו AppControllerIntegrationTest מעמד:

@RunWith (SpringRunner.class) @SpringBootTest (webEnvironment = WebEnvironment.RANDOM_PORT) AppControllerIntegrationTest {@LocalServerPort יציאת פרטי פרטית בכיתה ציבורית; פרטי מחרוזת uri; @ PostConstruct ציטוט ריק ריק () {uri = "// localhost:" + port; } @MockBean AppService appService; // מקרי בדיקה}

במבחן JUnit זה, הערנו את הכיתה שלנו עם כמה הערות ספציפיות לאביב שמסובבות את היישום באופן מקומי בנמל זמין אקראי. ב @PostConstruct, קלטנו את ה- URI המלא שעליו נבצע שיחות REST.

גם אנחנו השתמשנו @MockBean עַל AppService, כפי שאנו צריכים ללעוג לקריאת שיטה למעמד זה.

3. אימות תגובת JSON

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

3.1. אובייקט JSON יחיד

נניח שאנחנו צריכים לבדוק את / סרט / {id} נקודת קצה, שמחזירה א סרט אובייקט JSON אם תְעוּדַת זֶהוּת נמצא.

נלעוג AppService קורא להחזיר כמה נתונים מדומים באמצעות מסגרת Mockito:

@Test הציבור בטל givenMovieId_whenMakingGetRequestToMovieEndpoint_thenReturnMovie () {Movie testMovie = סרט חדש (1, "movie1", "סיכום 1"); מתי (appService.findMovie (1)). thenReturn (testMovie); קבל (uri + "/ movie /" + testMovie.getId ()). ואז () .assertThat () .statusCode (HttpStatus.OK.value ()) .body ("id", equalTo (testMovie.getId ()) ). גוף ("שם", equalTo (testMovie.getName ())). גוף ("תקציר", notNullValue ()); }

למעלה, לעגנו לראשונה ל appService.findMovie (1) התקשר להחזיר אובייקט. לאחר מכן בנינו את כתובת ה- REST שלנו ב- לקבל() השיטה המסופקת על ידי מבטיח REST לביצוע בקשות GET. לבסוף, הבאנו ארבע קביעות.

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

שים לב גם שאם התגובה JSON מקוננת, אנו יכולים לבדוק מפתח מקונן באמצעות ה- נְקוּדָה מפעיל כמו "Key1.key2.key3".

3.2. חילוץ תגובת JSON לאחר אימות

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

אנו יכולים לחלץ את תגובת JSON למחלקה באמצעות ה- לחלץ() שיטה:

תוצאת הסרט = קבל (uri + "/ movie /" + testMovie.getId ()). ואז () .assertThat () .statusCode (HttpStatus.OK.value ()). תמצית () .כמו (Movie.class); assertThat (תוצאה). isEqualTo (testMovie);

בדוגמה זו, כיוונו את מבטחי REST לחלץ את תגובת JSON ל- a סרט ואז טען על האובייקט שחולץ.

אנחנו יכולים גם לחלץ את כל התגובה ל- a חוּט, משתמש ב לחלץ (). asString () ממשק API:

מחרוזת responseString = get (uri + "/ movie /" + testMovie.getId ()). ואז () .assertThat () .statusCode (HttpStatus.OK.value ()). תמצית () .asString (); assertThat (responseString) .isNotEmpty ();

סוף כל סוף, אנו יכולים לחלץ שדה מסוים גם מהתגובה JSON.

בואו נבחן מבחן ל- POST API שמצפה ל- סרט גוף JSON ויחזיר אותו אם יוכנס בהצלחה:

@Test הציבור בטל givenMovie_whenMakingPostRequestToMovieEndpoint_thenCorrect () {בקשת מפה = HashMap חדש (); request.put ("id", "11"); request.put ("שם", "movie1"); request.put ("תקציר", "סיכום 1"); int movieId = given (). contentType ("application / json") .body (request) .when () .post (uri + "/ movie") .then () .assertThat () .statusCode (HttpStatus.CREATED.value ()). extract () .path ("id"); assertThat (movieId) .isEqualTo (11); }

למעלה, ביצענו תחילה את בקשת האובייקט שעלינו לפרסם. לאחר מכן חילצנו את תְעוּדַת זֶהוּת שדה מתגובת JSON שהוחזרה באמצעות נָתִיב() שיטה.

3.3. מערך JSON

אנו יכולים גם לאמת את התגובה אם מדובר במערך JSON:

@ מבחן ציבורי בטל whenCallingMoviesEndpoint_thenReturnAllMovies () {Set movieSet = HashSet new (); movieSet.add (סרט חדש (1, "movie1", "סיכום 1")); movieSet.add (סרט חדש (2, "movie2", "סיכום 2")); כאשר (appService.getAll ()). thenReturn (movieSet); קבל (uri + "/ סרטים"). ואז () .statusCode (HttpStatus.OK.value ()) .assertThat () .body ("size ()", הוא (2)); }

לראשונה לעגנו ל appService.getAll () עם כמה נתונים והגיש בקשה לנקודת הסיום שלנו. אז טענו את statusCode ו גודל של מערך התגובות שלנו.

ניתן לעשות זאת שוב באמצעות מיצוי:

סרט [] סרטים = קבל (uri + "/ סרטים"). ואז () .statusCode (200). תמצית (). כמו (סרט []. מחלקה); assertThat (films.length) .isEqualTo (2);

4. אימות כותרות ועוגיות

אנו יכולים לאמת כותרת או קובץ cookie של התגובה בשיטות עם אותו שם:

@ מבחן ציבורי בטל כאשר CallingWelcomeEndpoint_thenCorrect () {get (uri + "/ welcome"). ואז () .assertThat () .header ("sessionId", notNullValue ()) .cookie ("token", notNullValue ()); }

אנו יכולים גם לחלץ את הכותרות והעוגיות בנפרד:

תגובת תגובה = קבל (uri + "/ ברוך הבא"); מחרוזת כותרת שם = response.getHeader ("sessionId"); CookieValue מחרוזת = respons.getCookie ("אסימון"); assertThat (headerName) .isNotBlank (); assertThat (cookieValue) .isNotBlank ();

5. אימות קבצים

אם ה- REST API שלנו מחזיר קובץ, אנו יכולים להשתמש ב- asByteArray () שיטה לחילוץ התגובה:

קובץ קובץ = ClassPathResource חדש ("test.txt"). GetFile (); long fileSize = file.length (); מתי (appService.getFile (1)). thenReturn (קובץ); בתים [] תוצאה = קבל (uri + "/ הורד / 1"). asByteArray (); assertThat (result.length) .isEqualTo (fileSize);

הנה, לעגנו לראשונה appService.getFile (1) להחזיר קובץ טקסט שנמצא בקובץ שלנו src / test / resources נָתִיב. לאחר מכן התקשרנו לנקודת הסיום שלנו וחילצנו את התגובה ב- בתים [], שטענו אז שיש להם את הערך הצפוי.

6. מסקנה

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

כרגיל, הקוד במאמר זה זמין באתר Github.

REST תחתון

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

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

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