JavaRush /وبلاگ جاوا /Random-FA /بهار ترسناک نیست کوکی ها و سرصفحه ها
Павел
مرحله

بهار ترسناک نیست کوکی ها و سرصفحه ها

در گروه منتشر شد
محتویات چرخه مقالات تکرار مادر یادگیری است! بنابراین، بر اساس مقالات قبلی، بیایید یک پروژه راه‌اندازی فنری وب جدید ایجاد کنیم: MobilePhonePayment Connect h2، Lombok. یک لایه موجودیت ایجاد کنید: BalancePhoneEntity Integer id. شماره صحیح تلفن; نام رشته مشتری; موجودی عدد صحیح؛ ایجاد لایه‌ای از خدمات با روش‌ها: - جستجوی همه رکوردها در پایگاه داده - جستجوی رکورد با شناسه - جستجوی رکورد با شماره تلفن - جستجوی رکورد بر اساس نام کاربری (در صورت بازگشت یک برگه از سوابق، نام‌ها ممکن است همینطور باشد)
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 به Entity و برگشت را فراموش نکنید. Dto مشابه Entity خواهد بود: BalancePhoneDto Integer id. شماره صحیح تلفن; نام رشته مشتری; موجودی عدد صحیح؛ یک لایه DTO ایجاد کنید، کلاس InitiateUtils ایجاد کنید و پایگاه داده را با داده ها پر کنید: id 1، numberPhone 555000، موجودی 100، مشتری Ivan id 2، numberPhone 444000، موجودی 250، مشتری Marya id 3، numberPhone 111000، balance Ivan 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. بنابراین می توانیم از طریق روش های static ResponseEntity به قابلیت های آنها دسترسی داشته باشیم. می توانید در این مقاله بیشتر بخوانید . روش های بقیه کنترلر را می توان به صورت زیر پیاده سازی کرد: 1) نمایش رکورد توسط id
//поиск записи по 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 را در خط پرس و جو ارسال کردیم، در خروجی ورودی با آن دریافت می کنیم. 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 - پارامتر نام را در خط query ارسال کردیم، و در خروجی خواهیم لیستی از رکوردها را با نام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 بروید، پرچم را روی حالت خام قرار دهید، روی فلش کنار Text کلیک کنید و JSON را انتخاب کنید. JSON زیر را در پنجره کپی کنید:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
وقتی روی execution درخواست کلیک می کنیم، وضعیت پاسخ CREATED است. اکنون دوباره findAll را پرس و جو کنید و مطمئن شوید که یک ورودی جدید ظاهر می شود. 5) حذف یک ورودی با شناسه
//удаление записи по 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 را در خروجی دریافت می کنیم. . حالا یک درخواست دیگر برای findAll بدهید و مطمئن شوید که ساشا گم شده است. 6) تغییر شماره توسط id
//изменение номера телефона по 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. چندین پارامتر در این درخواست وجود دارد و همانطور که می بینید ما آنها را مانند قبل در خط query پاس نمی دهیم. حاشیه نویسی @RequestParam برای پارامترهای یک متد استفاده می شود. برای انتقال پارامترها از طریق Postman، باید به تب Params در پنجره درخواست بروید، نام پارامتر (id) را در ستون Key و مقدار (1) را در ستون Value نشان دهید. همین کار را با پارامتر دوم Key = phoneNumber، Value = 888000 انجام می دهیم. به رشته query دقت کنید، Postman آن را تغییر داد تا پارامترها به درستی ارسال شود. خروجی وضعیت OK را نشان می دهد. اکنون دوباره 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 و sum را 130 قرار می دهیم. خروجی وضعیت OK را نشان می دهد. حالا دوباره درخواست 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 API اجرا می شود که حول دو شی ساخته شده است - درخواست مشتری در یک HttpSerlvetRequest پیچیده می شود و پاسخ از 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 انجام دهیم و خروجی اوکی خواهد بود. در بالای پنجره، کتیبه Cookie(1) را پیدا کنید، با کلیک بر روی آن، کوکی هایی را که ما ارسال کرده ایم مشاهده خواهید کرد. نام: داده، مقدار: Come_to_the_dark_side. اطلاعاتی در مورد ویژگی های اصلی کلاس Cookie در جاوا. نحوه خواندن: حتی خواندن آن آسان تر است
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
در @CookieValue نام کوکی را که مقدار آن را می خوانیم نشان می دهیم و مقدار خوانده شده را در پاسخ نمایش می دهیم. 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 می رویم، پاسخی دریافت می کنیم که وضعیت اوکی است. اگر عالی هستید و از Google Chrome استفاده می کنید، سپس کلیدهای ترکیبی Ctrl + Shift + I را فشار دهید و به "ابزارهای توسعه دهنده" بروید، سپس به دنبال تب Network در پانل بالا بگردید ، با کلیک کردن روی آن به دنبال ورودی بگردید: set-headers ( اگر آنجا نیست صفحه را Refresh کنید) روی آن کلیک کنید و در پنجره باز شده تب Headers را انتخاب کنید و در ResponseHeaders سربرگ های خود را می بینیم. برای آشنایی با سرفصل ها فعلا همین کافی است. اکنون بخوانید: مطالعه ResponseEntity<!--?--> و خلاص شدن از شر آن در کنترلرهای Spring با آن، اجازه دهید من مرخصی بگیرم 🤓، دوباره می بینمت...
نظرات
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION