JavaRush /Java блогу /Random-KY /Жаз коркунучтуу эмес. Cookies & Headers
Павел
Деңгээл

Жаз коркунучтуу эмес. Cookies & Headers

Группада жарыяланган
МАКАЛАЛАР ЦИКЛИНИН МАЗМУНУ Кайталоо — окуунун энеси! Ошондуктан, мурунку макалалардын негизинде, келгиле, жаңы веб жазгы жүктөө долбоорун түзөлү: MobilePhonePayment Connect h2, Lombok. Объект катмарын түзүү: BalancePhoneEntity Integer id; бүтүн сан Телефон; String nameCustomer; бүтүн сан балансы; Методдор менен кызматтардын катмарын түзүңүз: - Маалыматтар базасынан бардык жазууларды издөө - Идентификатор боюнча жазууну издөө - Жазууну телефон номери боюнча издөө - Жазууну колдонуучунун аты боюнча издөө (жазуулар барагын кайтаруу керек, аттары мүмкүн болушу мүмкүн) бирдей болсун)
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; бүтүн сан Телефон; String nameCustomer; бүтүн сан балансы; DTO катмарын түзүңүз, InitiateUtils классын түзүңүз жана маалымат базасын маалымат менен толтуруңуз: id 1, номер телефону 555000, баланс 100, кардар Ivan id 2, телефон номери 444000, баланс 250, кардар Марья id 3, телефон номери 111000, баланс 60, кардар Ivan Create эс алуу контролеру, бирок аны ыкмалар менен толтурууга шашпаңыз. Эгерде сиз мурунку макаланы аткарсаңыз, анда бардык жазууларды көрсөтүү ыкмасы ушундай болушу керек болчу (мен азыр макаланын комментарийлерин карап чыгууну сунуштайм - өзгөчө Васorй Бабиндин комментарийинде):
//поиск записи по 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);
}
Биз Почтачыда сынайбыз (Биз бул тууралуу мурунку макалада айтканбыз, бул жерде бул программа боюнча дагы бир кичинекей колдонмо ). Биз ишке киргизебиз, GET сурам түрүн тандайбыз, URL сабына жазабыз: http://localhost:8080/find-number-phoneById/1 – суроо сапта id параметрин өткөрдүк, чыгарууда биз жазууну алабыз id 1ге барабар. Жаңы codeду кошкондон кийин, долбоорду кайра баштоону унутпаңыз😇 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 - биз суроо сапта ат параметрин өткөрүп алдык, жана чыгарууда биз 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 Бул ката эмес - бул сурам codeдоо өзгөчөлүктөрү, бул тууралуу оку . Бул жерде мындай болбошу үчүн 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 форматындагы an objectти өткөрүп беришибиз керек. Сурам терезесинде Дене өтмөгүнө өтүп, желекти чийки кылып коюп, Тексттин жанындагы жебени чыкылдатып, 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);
}
Биз жаңы сурам түзөбүз, DELETE суроо түрүн тандайбыз, URL сабына жазабыз: http://localhost:8080/delete-phoneById/4 – биз суроо сапта id параметрин өткөрдүк, чыгарууда OK статусун алабыз . Эми баарын таап, Саша жок экенине ынануу үчүн дагы бир суроо бериңиз. 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. Бул суроо-талапта бир нече параметрлер бар жана сиз көрүп тургандай, биз аларды мурункудай суроо сабында өткөрбөйбүз. @RequestParam annotationсы методдогу параметрлер үчүн колдонулат. Почтачы аркылуу параметрлерди өткөрүп берүү үчүн, суроо-талап терезесиндеги Парамалар өтмөгүнө өтүп, Ачкыч тилкесинде параметрдин атын (id) жана Нарк тилкесинде маанини (1) көрсөтүшүңүз керек. Экинчи параметр менен да ушундай кылабыз, Key = phoneNumber, Value = 888000. Суроо сабына көңүл буруңуз, Почтачы параметрлерди туура өткөрүү үчүн аны өзгөрттү. Чыгуу 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. Телефон номеринин маанисин 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 файлына өтөбүз. Cookie деген эмне ? Жөнөкөй сөз менен айтканда: Cookie файлдары браузер тарабынан тиркемеден бир жолу алынган маалыматтарды сактайт, андан кийин аларды сайтта кайра-кайра колдонууга болот. Сиз эки негизги нерсени бorшиңиз керек: кантип жазуу керек жана Cookie файлын кантип окуу керек. Кантип жазуу керек: Бардык Spring Web MVC эки an objectтин айланасында курулган Servlet API'нин үстүнө ишке ашырылат - кардардан келген суроо HttpSerlvetRequest менен оролот жана жооп сиздин codeуңуз менен толтурулган HttpServletResponseден түзүлөт. Бул an objectтерге жетүү менен, сиз бүт HTTP сеансын толук көзөмөлдөй аласыз. Жазгы веб бул an objectтерге түздөн-түз кирүүгө мүмкүндүк берет. Адатта 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ой вариант лучше
 }
http://localhost:8080/set-cookie дареги боюнча Почтачыга GET өтүнүчүн жасайлы жана жыйынтык жакшы болот. Терезенин үстүндө Cookie (1) деген жазууну табыңыз, аны басуу менен биз жөнөткөн кукилерди көрөсүз. Аты-жөнү: маалымат, маани: карангы_тарапка кел. Java тorндеги Cookie классынын негизги өзгөчөлүктөрү жөнүндө маалымат . Кантип окуу керек: Окуу дагы оңой
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
@CookieValue ичинде биз маанисин окуй турган cookie файлынын атын көрсөтөбүз жана жоопто окуу маанисин көрсөтөбүз. Come_to_the_the_karank_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 терүү кызыктуураак, натыйжада биз баш аттардын кеңири тизмесин алабыз. Алар эмне үчүн керек экенин түшүнүү үчүн ар бир аталышты Google'дан издеңиз. Wikipedia ошондой эле наамдардын тизмесин сунуштайт. "Эгер кимдир бирөө бир нерсени окуса, анда аны бирөө жазып алды" деген эски программалоо сөзү. Аталышын жазып алалы
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Бул жерде биз ResponseEntity классынын атайын баш ыкмасын колдондук . Мында "ат-баш" - баштын аталышы, ал эми "баа-башкы" - баштын мааниси. Баш аты менен иштөөнүн башка варианттары бар
//еще варианты работы с заголовками
@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);
}
Бул жерде биз MultiValueMap<String, String> түрүндөгү маанини алган ResponseEntity классынын башка ыкмасын колдонобуз . Ал ошондой эле браузерде кантип иштээрин текшерүү үчүн көбүрөөк маалымат болот. Биз http://localhost:8080/set-headers дарегине барабыз, абал жакшы деген жоопту алабыз. Эгер сиз мыкты болсоңуз жана Google Chrome колдонсоңуз, анда Ctrl + Shift + I баскычтарын басып , "Иштеп чыгуучу куралдарына" өтүңүз, андан кийин жогорку панелдеги Тармак өтмөгүн издеңиз , аны чыкылdateу менен жазууну издеңиз: set-headers ( эгерде ал жок болсо, баракты жаңыртыңыз) ошол жерди чыкылдатыңыз жана ачылган терезеден Headers өтмөгүн тандаңыз жана ResponseHeaders'те биз баштарыбызды көрөбүз. Баш макалалар менен таанышуу үчүн азырынча бул жетиштүү. Эми окуңуз: ResponseEntity<!--?--> изилдөө жана жазгы контроллерлордо андан арылуу Ушуну менен мен өргүүгө уруксат бериңизчи 🤓, кайрадан көрүшкөнчө...
Комментарийлер
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION