JavaRush /Blog Java /Random-VI /Mùa xuân không đáng sợ. Cookie & Tiêu đề
Павел
Mức độ

Mùa xuân không đáng sợ. Cookie & Tiêu đề

Xuất bản trong nhóm
NỘI DUNG CỦA CHU KỲ BÀI VIẾT Sự lặp lại là mẹ của việc học! Do đó, dựa trên các bài viết trước, hãy tạo một dự án khởi động web mùa xuân mới: MobilePhonePayment Connect h2, Lombok. Tạo một lớp thực thể: ID số nguyên BalancePhoneEntity; Số nguyênĐiện thoại; Tên chuỗiKhách hàng; Số dư số nguyên; Tạo một lớp dịch vụ với các phương thức: - Tìm kiếm tất cả các bản ghi trong cơ sở dữ liệu - Tìm kiếm bản ghi theo id - Tìm kiếm bản ghi theo số điện thoại - Tìm kiếm bản ghi theo tên người dùng (nên trả về một tờ bản ghi, các tên có thể giống nhau)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Thêm bản ghi vào cơ sở dữ liệu - Xóa bản ghi khỏi cơ sở dữ liệu theo id - Phương thức nghiệp vụ: Nạp số dư điện thoại - phương thức phải lấy số điện thoại, số tiền (loại Số nguyên) và tăng số dư của số tương ứng theo quy định số lượng.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
Đừng quên triển khai ánh xạ từ DTO sang Thực thể và ngược lại. Dto sẽ tương tự như Thực thể: BalancePhoneDto Integer id; Số nguyênĐiện thoại; Tên chuỗiKhách hàng; Số dư số nguyên; Tạo lớp DTO, tạo lớp InitiateUtils và điền dữ liệu vào cơ sở dữ liệu: id 1, numberPhone 555000, số dư 100, khách hàng Ivan id 2, numberPhone 444000, số dư 250, khách hàng Marya id 3, numberPhone 111000, số dư 60, khách hàng Ivan Tạo một bộ điều khiển nghỉ ngơi, nhưng đừng vội lấp đầy nó bằng các phương thức. Nếu bạn làm theo bài viết trước, thì phương pháp hiển thị tất cả các bản ghi sẽ giống như thế này (tôi khuyên bạn nên xem phần nhận xét cho bài viết - cụ thể là nhận xét của Vasily Babin):
//поиск записи по 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);
}
Có một cách khác để sử dụng ResponseEntity mà không cần sử dụng hàm tạo. Chúng tôi sẽ tiếp tục sử dụng nó. ResponseEntity hiển thị hai giao diện trình tạo lồng nhau: HeadersBuilder và giao diện con của nó, BodyBuilder. Do đó, chúng ta có thể truy cập khả năng của chúng thông qua các phương thức tĩnh của ResponseEntity. Bạn có thể đọc thêm trong bài viết này . Các phương thức điều khiển phần còn lại có thể được triển khai như sau: 1) Hiển thị bản ghi theo 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);
}
Chúng tôi thử nghiệm trong Postman (Chúng tôi đã nói về nó trong bài viết trước, đây là một hướng dẫn nhỏ khác về chương trình này ). Chúng tôi khởi chạy, chọn loại yêu cầu GET, viết vào dòng URL: http://localhost:8080/find-number-phoneById/1 – chúng tôi đã chuyển tham số id trong dòng truy vấn, ở đầu ra chúng tôi sẽ nhận được một mục có id bằng 1. Sau khi thêm mã mới, đừng quên khởi động lại dự án😇 2) Hiển thị các bản ghi theo tên
//поиск записи по имени пользователя
@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);
}
Hãy tạo một yêu cầu mới, chọn loại yêu cầu GET, viết vào dòng URL: http://localhost:8080/ find-number-phoneByName/Ivan - chúng tôi đã chuyển tham số tên trong dòng truy vấn và ở đầu ra, chúng tôi sẽ lấy danh sách các bản ghi có tênKhách hàng bằng Ivan. Có lẽ ở đầu ra, bạn sẽ nhận được một cái gì đó tương tự như thế này: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 Đây không phải là lỗi - đây là các tính năng của mã hóa yêu cầu, hãy đọc về nó . Và ở đây nó được viết cách cấu hình Postman để điều này không xảy ra. 3) Đầu ra của tất cả các bản ghi:
//поиск всех записей
@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);
}
Chúng tôi tạo một yêu cầu mới, chọn loại yêu cầu GET, viết vào dòng URL: http://localhost:8080/findAll - chúng tôi không chuyển bất kỳ tham số nào ở đây. 4) Thêm mục mới:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Chúng tôi tạo một yêu cầu mới, chọn loại yêu cầu POST và viết vào dòng URL: http://localhost:8080/entry. Trong yêu cầu này, chúng ta cần truyền một đối tượng ở định dạng JSON. Trong cửa sổ yêu cầu, chuyển đến tab Nội dung, đặt cờ thành thô, nhấp vào mũi tên bên cạnh Văn bản và chọn JSON. Sao chép JSON sau vào cửa sổ:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
Khi chúng ta nhấp vào thực hiện yêu cầu, trạng thái phản hồi là TẠO. Bây giờ hãy truy vấn lại findAll và đảm bảo một mục mới xuất hiện. 5) Xóa mục nhập theo id
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Chúng tôi tạo một yêu cầu mới, chọn loại yêu cầu XÓA, viết vào dòng URL: http://localhost:8080/delete-phoneById/4 – chúng tôi đã chuyển tham số id trong dòng yêu cầu, Chúng tôi nhận được trạng thái OK ở đầu ra . Bây giờ hãy thực hiện một yêu cầu khác tới findAll và đảm bảo rằng Sasha bị thiếu. 6) Đổi số theo 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);
}
Chúng tôi tạo một yêu cầu mới, chọn loại yêu cầu PUT và viết vào dòng URL: http://localhost:8080/change. Có một số tham số trong yêu cầu này và như bạn có thể thấy, chúng tôi không chuyển chúng vào dòng truy vấn như trước. Chú thích @RequestParam được sử dụng cho các tham số trong một phương thức. Để truyền tham số qua Postman, bạn cần vào tab Params trong cửa sổ yêu cầu, cho biết tên của tham số (id) trong cột Key và cho biết giá trị (1) trong cột Value. Chúng ta làm tương tự với tham số thứ 2 là Key = phoneNumber, Value = 888000. Hãy chú ý đến chuỗi truy vấn, Postman đã thay đổi để truyền tham số một cách chính xác. Đầu ra sẽ hiển thị trạng thái OK. Bây giờ hãy truy vấn lại findAll và đảm bảo rằng số điện thoại cho mục nhập đầu tiên đã thay đổi. 7) Nạp tiền vào số dư điện thoại của bạn
@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);
}
Chúng tôi tạo một yêu cầu mới, chọn loại yêu cầu PUT và viết vào dòng URL: http://localhost:8080/add. Chúng tôi đặt giá trị phoneNumber thành 888000, tổng bằng 130. Đầu ra sẽ hiển thị trạng thái OK. Bây giờ hãy chạy lại yêu cầu findAll và đảm bảo rằng số dư của bản ghi đầu tiên đã thay đổi. 8) PUT qua phần thân yêu cầu - tốt nhất nên làm điều này để không mở dữ liệu được truyền
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Chúng tôi gửi JSON
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
Cuối cùng chúng ta chuyển sang Cookie. Cookie là gì ? Nói một cách đơn giản: Cookie lưu trữ dữ liệu mà trình duyệt nhận được một lần từ một ứng dụng, sau đó có thể được sử dụng nhiều lần trên trang web. Bạn cần biết hai điều cơ bản: cách viết và cách đọc Cookie. Cách viết: Toàn bộ Spring Web MVC được triển khai dựa trên API Servlet, được xây dựng xung quanh hai đối tượng - yêu cầu từ máy khách được gói trong HttpSerlvetRequest và phản hồi được tạo từ HttpServletResponse chứa đầy mã của bạn. Bằng cách có quyền truy cập vào các đối tượng này, bạn có toàn quyền kiểm soát toàn bộ phiên HTTP. Spring web cho phép bạn truy cập trực tiếp vào các đối tượng này. Thông thường là Cookie, hãy tạo một phương thức trong bộ điều khiển
//записать куки
 @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ой вариант лучше
 }
Hãy thực hiện một yêu cầu GET trong Postman tại địa chỉ: http://localhost:8080/set-cookie và kết quả sẽ ổn. Phía trên cửa sổ, tìm dòng chữ Cookie(1), bằng cách nhấp vào nó, bạn sẽ thấy các Cookie mà chúng tôi đã gửi. Tên: dữ liệu, giá trị: Come_to_the_dark_side. Thông tin về các tính năng chính của lớp Cookie trong java. Cách đọc: Thậm chí còn dễ đọc hơn
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
Trong @CookieValue, chúng tôi chỉ ra tên của Cookie có giá trị mà chúng tôi sẽ đọc và hiển thị giá trị đã đọc trong phản hồi. Come_to_the_dark_side Bây giờ, giờ tuyệt vời nhất đã đến Header ( headers , đừng xem bài viết về PHP, nó khá hữu ích để đọc): Đầu tiên, hãy xem bạn có thể đọc các tiêu đề như thế nào:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
Công việc chính được thực hiện bởi @RequestHeader Map<String, String> , nó biểu thị các tiêu đề dưới dạng bản đồ, trong đó khóa là tên của tiêu đề và giá trị của bản đồ là giá trị của tiêu đề. Sẽ thú vị hơn khi thử nghiệm phương pháp này bằng trình duyệt, mở trình duyệt, nhập http://localhost:8080/get-headers vào thanh tìm kiếm và kết quả là chúng tôi nhận được một danh sách tiêu đề mở rộng. Google từng tiêu đề để hiểu lý do tại sao chúng cần thiết. Wikipedia cũng cung cấp một danh sách các tiêu đề. “Nếu ai đó đọc được điều gì đó thì sẽ có người viết nó ra” là một câu nói lâu đời của lập trình viên. Hãy viết tiêu đề
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Ở đây chúng ta đã sử dụng một phương thức tiêu đề đặc biệt của lớp ResponseEntity . Trong đó "tiêu đề tên" là tên của tiêu đề và "tiêu đề giá trị" là giá trị của tiêu đề. Có các tùy chọn khác để làm việc với tiêu đề
//еще варианты работы с заголовками
@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);
}
Ở đây chúng ta sử dụng một phương thức khác của lớp ResponseEntity, phương thức này nhận giá trị kiểu MultiValueMap<String, String> . Nó cũng sẽ có nhiều thông tin hơn để kiểm tra cách nó hoạt động trong trình duyệt. Chúng ta vào địa chỉ http://localhost:8080/set-headers thì nhận được phản hồi là trạng thái OK. Nếu bạn giỏi và sử dụng Google Chrome thì hãy nhấn tổ hợp phím Ctrl + Shift + I và đi tới “Công cụ dành cho nhà phát triển”, sau đó tìm tab Mạng ở bảng trên cùng , bằng cách nhấp vào nó hãy tìm mục: set-headers ( nếu nó không có ở đó, hãy làm mới trang) nhấp vào đó và trong cửa sổ mở ra, chọn tab Tiêu đề và trong ResponseHeaders , chúng tôi thấy các tiêu đề của mình. Để làm quen với các tiêu đề, bây giờ thế là đủ. Bây giờ hãy đọc: Nghiên cứu ResponseEntity<!--?--> và loại bỏ nó trong bộ điều khiển Spring Với điều đó, hãy để tôi rời đi 🤓, hẹn gặp lại...
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION