JavaRush /בלוג Java /Random-HE /האביב לא מפחיד. עוגיות וכותרות
Павел
רָמָה

האביב לא מפחיד. עוגיות וכותרות

פורסם בקבוצה
תוכן מחזור המאמרים החזרה היא אם הלמידה! לכן, בהתבסס על מאמרים קודמים, בואו ניצור פרויקט קפיץ-אתחול אינטרנט חדש: MobilePhonePayment Connect h2, Lombok. צור שכבת ישות: BalancePhoneEntity ID Integer; מספר שלם טלפון; שם מחרוזת לקוח; מאזן מספר שלם; יצירת שכבת שירותים עם שיטות: - חיפוש כל הרשומות במסד הנתונים - חיפוש רשומה לפי id - חיפוש רשומה לפי מספר טלפון - חיפוש רשומה לפי שם משתמש (צריך להחזיר דף רשומות, השמות עשויים להיות אותו הדבר)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- הוספת רשומה למסד הנתונים - הסרת רשומה ממסד הנתונים לפי id - שיטה עסקית: טעינת יתרת טלפון - השיטה חייבת לקחת מספר טלפון, סכום (סוג שלם) ולהגדיל את יתרת המספר המקביל לפי המפורט כמות.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
אל תשכח ליישם מיפוי מ-DTO ל-Entity ובחזרה. Dto יהיה דומה ל-Entity: BalancePhoneDto מזהה שלם; מספר שלם טלפון; שם מחרוזת לקוח; מאזן מספר שלם; צור שכבת DTO, צור את המחלקה InitiateUtils ומלא את מסד הנתונים בנתונים: מזהה 1, מספר טלפון 555000, יתרה 100, מזהה לקוח Ivan 2, מספר טלפון 444000, יתרה 250, לקוח Marya id 3, מספר טלפון 111000, יתרה 60, לקוח Ivan Create בקר מנוחה, אבל אל תמהרו למלא אותו בשיטות. אם אתה עוקב אחר המאמר הקודם, אז השיטה להצגת כל הרשומות הייתה אמורה להתברר בערך כך (אני ממליץ כעת לעיין בהערות למאמר - במיוחד בתגובה של וסילי באבין):
//поиск записи по id - старая version
@GetMapping(value = "/find-phone/{id}")
public ResponseEntity<BalanceDto> findPhone(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? new ResponseEntity<>(balanceDto, HttpStatus.OK)
            : new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
יש דרך נוספת להשתמש ב-ResponsEntity, מבלי להשתמש בבנאי. נמשיך להשתמש בו. ResponseEntity חושף שני ממשקי בונה מקוננים: HeadersBuilder וממשק המשנה שלו, BodyBuilder. לכן, אנו יכולים לגשת ליכולות שלהם באמצעות השיטות הסטטיות של ResponseEntity. אתה יכול לקרוא עוד במאמר זה . ניתן ליישם את שיטות בקר המנוחה באופן הבא: 1) הצגת רשומה לפי מזהה
//поиск записи по id
@GetMapping(value = "/find-number-phoneById/{id}")
public ResponseEntity<?> findNumberPhoneById(@PathVariable Integer id) {
    BalanceDto balanceDto = balanceService.findById(id);
    return balanceDto != null
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
אנחנו בודקים ב-Postman (דיברנו על זה במאמר הקודם, הנה עוד מדריך קטן על התוכנית הזו ). אנו משיקים, בוחרים את סוג הבקשה GET, כותבים בשורת ה-URL: http://localhost:8080/find-number-phoneById/1 – העברנו את הפרמטר id בשורת השאילתה, בפלט נקבל ערך עם מזהה שווה ל-1. לאחר הוספת הקוד החדש, אל תשכח להפעיל מחדש את הפרויקט😇 2) הצג רשומות לפי שם
//поиск записи по имени пользователя
@GetMapping(value = "/find-number-phoneByName/{name}")
public ResponseEntity<?> findNumberPhone(@PathVariable String name) {
    List<BalanceDto> balanceDto = balanceService.findByNameCustomer(name);
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
בואו ניצור בקשה חדשה, נבחר את סוג הבקשה GET, נכתוב בשורת ה-URL: http://localhost:8080/ find-number-phoneByName/Ivan - העברנו את פרמטר השם בשורת השאילתה, ובפלט נגיע קבל רשימה של רשומות עם השםCustomer שווה לאיוון. אולי בפלט תקבל משהו דומה לזה: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 זו לא שגיאה - אלו הן תכונות של קידוד בקשות, קרא על זה . וכאן כתוב איך להגדיר את Postman כך שזה לא יקרה. 3) פלט של כל הרשומות:
//поиск всех записей
@GetMapping(value = "/findAll")
public ResponseEntity<?> findAll() {
    List<BalanceDto> balanceDto = balanceService.findAll();
    return balanceDto != null &&  !balanceDto.isEmpty()
            ? ResponseEntity.ok(balanceDto)
            : ResponseEntity.ok().body(HttpStatus.NOT_FOUND);
}
אנחנו יוצרים בקשה חדשה, בוחרים את סוג הבקשה GET, כותבים בשורת ה-URL: http://localhost:8080/findAll - אנחנו לא מעבירים כאן שום פרמטר. 4) הוספת ערך חדש:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
אנו יוצרים בקשה חדשה, בוחרים את סוג בקשת POST וכותבים בשורת ה-URL: http://localhost:8080/entry. בבקשה זו עלינו להעביר אובייקט בפורמט JSON. בחלון הבקשה, עבור ללשונית Body, הגדר את הדגל ל-raw, לחץ על החץ לצד טקסט ובחר JSON. העתק את ה-JSON הבא לחלון:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
כאשר אנו לוחצים על בצע את הבקשה, סטטוס התגובה נוצר. כעת בצע שאילתה FindAll שוב וודא שמופיע ערך חדש. 5) מחיקת ערך לפי id
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
אנו יוצרים בקשה חדשה, בוחרים את סוג הבקשה DELETE, כותבים בשורת ה-URL: http://localhost:8080/delete-phoneById/4 – העברנו את הפרמטר id בשורת הבקשה, נקבל את הסטטוס OK בפלט . כעת בקש עוד בקשה למצוא את הכל ולוודא שסאשה חסר. 6) שינוי המספר לפי מזהה
//изменение номера телефона по id
@PutMapping(value = "/change")
public ResponseEntity<?> changeNumberPhone(
//можно добавлять несколько параметров в request
        @RequestParam(value = "id") Integer id, //добавor один параметр
        @RequestParam(value = "phoneNumber") Integer phoneNumber) //добавor второй параметр
 {
    BalanceDto byId = balanceService.findById(id);
    byId.setNumberPhone(phoneNumber);
    balanceService.save(byId);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
אנו יוצרים בקשה חדשה, בוחרים את סוג בקשת PUT וכותבים בשורת ה-URL: http://localhost:8080/change. יש כמה פרמטרים בבקשה זו, וכפי שניתן לראות, אנחנו לא מעבירים אותם בשורת השאילתה כמו קודם. ההערה @RequestParam משמשת לפרמטרים בשיטה. כדי להעביר פרמטרים דרך Postman, יש לעבור ללשונית Params בחלון הבקשה, לציין את שם הפרמטר (id) בעמודת Key ולציין את הערך (1) בעמודה Value. אנחנו עושים את אותו הדבר עם הפרמטר השני, Key = phoneNumber, Value = 888000. שימו לב למחרוזת השאילתה, Postman שינה אותה כדי להעביר את הפרמטרים בצורה נכונה. הפלט יציג את המצב בסדר. כעת בצע שאילתה FindAll שוב וודא שמספר הטלפון עבור הערך הראשון השתנה. 7) השלם את יתרת הטלפון שלך
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(
        //можно добавлять несколько параемров в request
        @RequestParam(value = "phoneNumber") Integer phoneNumber,//добавor один параметр
        @RequestParam(value = "sum") Integer sum) //добавor второй параметр
{
    balanceService.addingMoneyToBalance(phoneNumber, sum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
אנו יוצרים בקשה חדשה, בוחרים את סוג בקשת PUT, וכותבים בשורת ה-URL: http://localhost:8080/add. אנחנו מגדירים את ערך phoneNumber ל-888000, סכום ל-130. הפלט יציג את המצב OK. כעת הפעל שוב את הבקשה findAll וודא שהיתרה של הרשומה הראשונה השתנתה. 8) PUT דרך גוף הבקשה - עדיף לעשות זאת כדי לא לפתוח את הנתונים המועברים
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
אנחנו שולחים JSON
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
לבסוף אנחנו עוברים לעוגייה. מה זה קוקי ? במילים פשוטות: עוגיות מאחסנות נתונים שהתקבלו פעם אחת על ידי הדפדפן מאפליקציה, אשר לאחר מכן ניתן להשתמש בהם שוב ושוב באתר. אתה צריך לדעת שני דברים בסיסיים: איך לכתוב ואיך לקרוא Cookie. איך כותבים: כל Spring Web MVC מיושם על גבי ה-servlet API, שבנוי סביב שני אובייקטים - הבקשה מהלקוח עטופה ב-HttpSerlvetRequest, והתגובה נוצרת מה-HttpServletResponse המלא בקוד שלך. על ידי גישה לאובייקטים אלה, יש לך שליטה מלאה על כל הפעלת ה-HTTP. Spring web מאפשר לך לגשת ישירות לאובייקטים האלה. בדרך כלל Cookie, בואו ניצור שיטה בבקר
//записать куки
 @GetMapping(value = "/set-cookie")
public ResponseEntity<?> setCookie(HttpServletResponse response) throws IOException {
     Cookie cookie = new Cookie("data", "Come_to_the_dark_side");//создаем an object Cookie,
     //в конструкторе указываем значения для name и value
     cookie.setPath("/");//устанавливаем путь
     cookie.setMaxAge(86400);//здесь устанавливается время жизни куки
     response.addCookie(cookie);//добавляем Cookie в request
     response.setContentType("text/plain");//устанавливаем контекст
     return ResponseEntity.ok().body(HttpStatus.OK);//получилось How бы два раза статус ответа установor, выбирайте Howой вариант лучше
 }
בוא נגיש בקשת GET ב-Postman בכתובת: http://localhost:8080/set-cookie והפלט יהיה בסדר. מעל החלון, מצא את הכיתוב Cookie(1), בלחיצה עליו תראה את העוגיות ששלחנו. שם: נתונים, ערך: Come_to_the_dark_side. מידע על המאפיינים העיקריים של מחלקת העוגיות ב-java. איך לקרוא: אפילו יותר קל לקריאה
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
ב-@CookieValue אנו מציינים את שם ה-Cookie שאת הערך שלו נקרא, ומציגים את ערך הקריאה בתגובה. Come_to_the_dark_side עכשיו הגיעה השעה הטובה ביותר Header ( כותרות , אל תסתכלו במאמר על PHP, זה די שימושי לקריאה): ראשית, בואו נראה איך אתם יכולים לקרוא את הכותרות:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
העבודה העיקרית נעשית על ידי @RequestHeader Map<String, String> , היא מייצגת כותרות בצורה של מפה, כאשר המפתח הוא שם הכותרת, והערך של המפה הוא ערך הכותרת. יותר מעניין לבדוק את השיטה הזו באמצעות דפדפן, לפתוח את הדפדפן, להקליד http://localhost:8080/get-headers בשורת החיפוש, וכתוצאה מכך נקבל רשימה נרחבת של כותרות. חפש בגוגל כל כותרת כדי להבין מדוע הם נחוצים. ויקיפדיה מציעה גם רשימה של כותרות. "אם מישהו קרא משהו, אז מישהו רשם אותו" היא משפט תכנות ישן. בוא נרשום את הכותרת
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
כאן השתמשנו בשיטת כותרת מיוחדת של המחלקה ResponseEntity . כאשר "name-header" הוא שם הכותרת, ו-"value-header" הוא הערך של הכותרת. ישנן אפשרויות נוספות לעבודה עם כותרות
//еще варианты работы с заголовками
@GetMapping(value = "/set-headers")
public ResponseEntity<?> setHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();//создаем an object
    //который имплементирует мапу MultiValueMap<String, String>
    //наполняем ее парами ключ-meaning
    //можно наполнить своими заголовками через метод add
    httpHeaders.add("customer-header", "value-header1");
    //HttpHeaders так же предлагает большой выбор стандартных заголовков
    //Посмотрите на них набрав в IDEA HttpHeaders.
    httpHeaders.add(HttpHeaders.FROM, "russia");
    //можно изменить существующий заголовок, вызвав для него сет-метод
    httpHeaders.setDate(0);
    //or получить meaning конкретного заголовка
    Long date = httpHeaders.getDate();
    System.out.println(date);
    return ResponseEntity
            .ok().headers(httpHeaders)//здесь метод принимающий MultiValueMap<String, String>
            .body(HttpStatus.OK);
}
כאן אנו משתמשים בשיטה אחרת של המחלקה ResponseEntity, אשר לוקחת ערך מסוג MultiValueMap<String, String> . זה יהיה גם אינפורמטיבי יותר לבדוק איך זה עובד בדפדפן. אנו עוברים לכתובת http://localhost:8080/set-headers, אנו מקבלים תשובה שהסטטוס תקין. אם אתה גדול ומשתמש בגוגל כרום, לחץ על שילוב המקשים Ctrl + Shift + I ועבור אל "כלי מפתחים", ולאחר מכן חפש את הכרטיסייה Network בחלונית העליונה , על ידי לחיצה חפש את הערך: set-headers ( אם זה לא שם, רענן את העמוד) לחץ על שם ובחלון שנפתח בחר בלשונית Headers וב- ResponseHeaders נראה את הכותרות שלנו. כדי להכיר את הכותרות, זה מספיק בינתיים. עכשיו קראו: ללמוד את ResponseEntity<!--?--> ולהיפטר ממנו בבקרי Spring עם זה, הרשו לי לצאת לחופשה 🤓, נתראה שוב...
הערות
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION