JavaRush /مدونة جافا /Random-AR /الربيع ليس مخيفا. ملفات تعريف الارتباط والعناوين
Павел
مستوى

الربيع ليس مخيفا. ملفات تعريف الارتباط والعناوين

نشرت في المجموعة
محتويات دورة المقالات التكرار هو أم التعلم! لذلك، استنادًا إلى المقالات السابقة، فلنقم بإنشاء مشروع تمهيد ويب جديد: MobilePhonePayment Connect h2, Lombok. إنشاء طبقة كيان: معرف BalancePhoneEntity Integer؛ رقم صحيحالهاتف؛ اسم السلسلة العميل؛ توازن صحيح؛ إنشاء طبقة من الخدمات باستخدام الطرق: - البحث عن جميع السجلات في قاعدة البيانات - البحث عن سجل حسب المعرف - البحث عن سجل عن طريق رقم الهاتف - البحث عن سجل حسب اسم المستخدم (يجب إرجاع ورقة من السجلات، قد تكون الأسماء كن هو نفسه)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- إضافة سجل إلى قاعدة البيانات - إزالة سجل من قاعدة البيانات عن طريق المعرف - طريقة العمل: تعبئة رصيد الهاتف - يجب أن تأخذ الطريقة رقم هاتف ومبلغ (نوع عدد صحيح) وزيادة رصيد الرقم المقابل حسب المحدد كمية.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
لا تنس تنفيذ التعيين من DTO إلى الكيان والعودة. سيكون Dto مشابهًا للكيان: BalancePhoneDto Integer id؛ رقم صحيحالهاتف؛ اسم السلسلة العميل؛ توازن صحيح؛ قم بإنشاء طبقة DTO، وقم بإنشاء فئة InitiateUtils واملأ قاعدة البيانات بالبيانات: المعرف 1، رقم الهاتف 555000، الرصيد 100، معرف العميل إيفان 2، رقم الهاتف 444000، الرصيد 250، معرف العميل ماريا 3، رقم الهاتف 111000، الرصيد 60، العميل إيفان إنشاء وحدة تحكم في الراحة، لكن لا تتعجل في ملئها بالطرق. إذا اتبعت المقالة السابقة، فيجب أن تكون طريقة عرض جميع السجلات شيئًا كهذا (أوصي الآن بالنظر في التعليقات على المقالة - على وجه التحديد في تعليق فاسيلي بابين):
//поиск записи по 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);
}
هناك طريقة أخرى لاستخدام ResponseEntity، دون استخدام المُنشئ. سوف نستمر في استخدامه. يعرض 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 - مررنا معلمة المعرف في سطر الاستعلام، في الإخراج سنتلقى إدخالاً به المعرف يساوي 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 - لقد مررنا معلمة الاسم في سطر الاستعلام، وفي الإخراج سنقوم بذلك احصل على قائمة السجلات التي تحتوي على nameCustomer والتي تساوي Ivan. ربما ستحصل في الإخراج على شيء مشابه لهذا: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 هذا ليس خطأ - هذه هي ميزات تشفير الطلب، اقرأ عنها . وهنا مكتوب كيفية تكوين ساعي البريد حتى لا يحدث هذا. 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. في نافذة الطلب، انتقل إلى علامة تبويب النص، واضبط العلامة على الخام، وانقر فوق السهم الموجود بجوار النص وحدد JSON. انسخ JSON التالي إلى النافذة:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
عندما نضغط على تنفيذ الطلب، يتم إنشاء حالة الاستجابة. الآن قم بالاستعلام عن findAll مرة أخرى وتأكد من ظهور إدخال جديد. 5) حذف الإدخال عن طريق الهوية
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
نقوم بإنشاء طلب جديد، ونحدد نوع طلب الحذف، ونكتب في سطر URL: http://localhost:8080/delete-phoneById/4 – لقد مررنا معلمة المعرف في سطر الطلب، وحصلنا على حالة موافق في الإخراج . الآن قم بتقديم طلب آخر للعثور على الكل وتأكد من اختفاء ساشا. 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) في عمود المفتاح، والإشارة إلى القيمة (1) في عمود القيمة. نحن نفعل الشيء نفسه مع المعلمة الثانية، 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. قمنا بتعيين قيمة رقم الهاتف على 888000، ومجموعها 130. وسيظهر الناتج حالة موافق. الآن قم بتشغيل طلب findAll مرة أخرى وتأكد من تغيير رصيد السجل الأول. 8) ضع من خلال نص الطلب - يفضل القيام بذلك حتى لا يتم فتح البيانات المرسلة
@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
}
أخيرًا ننتقل إلى ملف تعريف الارتباط. ما هو ملف تعريف الارتباط ؟ ببساطة: تقوم ملفات تعريف الارتباط بتخزين البيانات التي يتلقاها المتصفح مرة واحدة من أحد التطبيقات، والتي يمكن بعد ذلك استخدامها بشكل متكرر على الموقع. أنت بحاجة إلى معرفة شيئين أساسيين: كيفية الكتابة وكيفية قراءة ملف تعريف الارتباط. كيفية الكتابة: يتم تنفيذ Spring Web MVC بالكامل أعلى واجهة برمجة تطبيقات Servlet، والتي تم إنشاؤها حول كائنين - يتم تغليف الطلب من العميل في HttpServletRequest، ويتم إنشاء الاستجابة من HttpServletResponse المملوءة بالكود الخاص بك. ومن خلال الوصول إلى هذه الكائنات، يكون لديك التحكم الكامل في جلسة HTTP بأكملها. يتيح لك Spring web الوصول إلى هذه الكائنات مباشرة. عادةً ما نقوم بإنشاء طريقة لملف تعريف الارتباط في وحدة التحكم
//записать куки
 @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 وسيكون الإخراج على ما يرام. أعلى النافذة، ابحث عن النقش ملف تعريف الارتباط (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، نشير إلى اسم ملف تعريف الارتباط الذي سنقرأ قيمته، ونعرض قيمة القراءة في الرد. Come_to_the_dark_side الآن جاءت أفضل ساعة Header ( headers ، لا تنظر إلى المقالة حول 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، ونتلقى ردًا بأن الحالة على ما يرام. إذا كنت رائعًا وتستخدم Google Chrome، فاضغط على مجموعة المفاتيح Ctrl + Shift + I وانتقل إلى "أدوات المطور"، ثم ابحث عن علامة التبويب " الشبكة " في اللوحة العلوية ، وبالنقر عليها ابحث عن الإدخال: set-headers ( إذا لم يكن هناك، فقم بتحديث الصفحة) انقر هناك وفي النافذة التي تفتح، حدد علامة التبويب الرؤوس وفي ResponseHeaders نرى رؤوسنا. للتعرف على العناوين الرئيسية، هذا يكفي الآن. اقرأ الآن: دراسة ResponseEntity<!--?--> والتخلص منه في Spring Controllers وبهذا دعني آخذ إجازتي 🤓، نراكم مرة أخرى...
تعليقات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION