JavaRush /Blog Java /Random-PL /Wiosna nie jest straszna. Pliki cookie i nagłówki
Павел
Poziom 11

Wiosna nie jest straszna. Pliki cookie i nagłówki

Opublikowano w grupie Random-PL
TREŚĆ CYKLU ARTYKUŁÓW Powtarzanie jest matką nauki! Dlatego w oparciu o poprzednie artykuły utwórzmy nowy projekt webowy typu spring-boot: MobilePhonePayment Connect h2, Lombok. Utwórz warstwę encji: BalancePhoneEntity Integer id; Liczba całkowitaTelefon; Nazwa ciąguKlient; Bilans całkowity; Utwórz warstwę usług za pomocą metod: - Wyszukaj wszystkie rekordy w bazie - Wyszukaj rekord po id - Wyszukaj rekord po numerze telefonu - Wyszukaj rekord po nazwie użytkownika (należy zwrócić arkusz rekordów, nazwy mogą być takim samym)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- Dodanie rekordu do bazy - Usunięcie rekordu z bazy po id - Metoda biznesowa: Doładowanie salda telefonu - metoda polega na pobraniu numeru telefonu, kwoty (typu Integer) i zwiększeniu salda odpowiedniego numeru o określoną kwotę kwota.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
Nie zapomnij zaimplementować mapowania z DTO do Entity i z powrotem. Dto będzie podobne do Entity: BalancePhoneDto Integer id; Liczba całkowitaTelefon; Nazwa ciąguKlient; Bilans całkowity; Utwórz warstwę DTO, utwórz klasę InitiateUtils i wypełnij bazę danych danymi: id 1, numberPhone 555000, saldo 100, klient Ivan id 2, numberPhone 444000, saldo 250, klient Marya id 3, numberPhone 111000, saldo 60, klient Ivan Create kontroler odpoczynku, ale nie spiesz się z wypełnianiem go metodami. Jeśli postępujesz zgodnie z poprzednim artykułem, metoda wyświetlania wszystkich rekordów powinna wyglądać mniej więcej tak (polecam teraz zajrzeć do komentarzy do artykułu - konkretnie do komentarza Wasilija Babina):
//поиск записи по id - старая wersja
@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);
}
Istnieje inny sposób użycia ResponseEntity bez użycia konstruktora. Będziemy z niego nadal korzystać. ResponseEntity udostępnia dwa zagnieżdżone interfejsy konstruktora: HeadersBuilder i jego podinterfejs BodyBuilder. Dlatego możemy uzyskać dostęp do ich możliwości poprzez statyczne metody ResponseEntity. Więcej możesz przeczytać w tym artykule . Metody kontrolera reszty można zaimplementować w następujący sposób: 1) Wyświetlanie rekordu według identyfikatora
//поиск записи по 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);
}
Testujemy w Postmanie (mówiliśmy o tym w poprzednim artykule, oto kolejny mały poradnik na temat tego programu ). Uruchamiamy, wybieramy typ żądania GET, w linii URL wpisujemy: http://localhost:8080/find-number-phoneById/1 – w linii zapytania przekazaliśmy parametr id, na wyjściu otrzymamy wpis z id równy 1. Po dodaniu nowego kodu nie zapomnij zrestartować projektu😇 2) Wyświetl rekordy według nazwy
//поиск записи по имени пользователя
@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);
}
Stwórzmy nowe żądanie, wybierzmy typ żądania GET, w linii URL napiszmy: http://localhost:8080/find-number-phoneByName/Ivan – w linii zapytania przekazaliśmy parametr name, a na wyjściu będziemy uzyskaj listę rekordów o nazwieKlient równy Ivan. Być może na wyjściu otrzymasz coś podobnego do tego: %D1%8D%D1%82%D0%BE%20%D0%BD%D0%B5%20%D0%BE%D1%88%D0%B8%D0 % B1%D0%BA%D0%B0 To nie jest błąd - to są cechy kodowania żądań, przeczytaj o tym . A tutaj jest napisane jak skonfigurować Postmana aby tak się nie stało. 3) Dane wyjściowe wszystkich rekordów:
//поиск всех записей
@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);
}
Tworzymy nowe żądanie, wybieramy typ żądania GET, w linijce adresu URL wpisujemy: http://localhost:8080/findAll – nie przekazujemy tutaj żadnych parametrów. 4) Dodanie nowego wpisu:
//добавление новой записи
@PostMapping(value = "/entry")
public ResponseEntity<?> entryNumber(@RequestBody BalanceDto dto){
    balanceService.save(dto);
    return ResponseEntity.ok().body(HttpStatus.CREATED);
}
Tworzymy nowe żądanie, wybieramy typ żądania POST i w wierszu adresu URL wpisujemy: http://localhost:8080/entry. W tym żądaniu musimy przekazać obiekt w formacie JSON. W oknie żądania przejdź do zakładki Treść, ustaw flagę na surową, kliknij strzałkę obok Tekst i wybierz JSON. Skopiuj następujący kod JSON do okna:
{
        "numberPhone": 767676,
        "nameCustomer": „Sasza”,
        "balance": 100
}
Kiedy klikniemy Wykonaj żądanie, status odpowiedzi to UTWORZONY. Teraz ponownie wykonaj zapytanie findAll i upewnij się, że pojawił się nowy wpis. 5) Usuwanie wpisu po identyfikatorze
//удаление записи по id
@DeleteMapping(value = "/delete-phoneById/{id}")
public ResponseEntity<?> delete(@PathVariable Integer id) {
    balanceService.delete(id);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Tworzymy nowe żądanie, wybieramy typ żądania DELETE, w linii URL wpisujemy: http://localhost:8080/delete-phoneById/4 – w linii żądania przekazaliśmy parametr id, na wyjściu otrzymujemy status OK . Teraz złóż kolejną prośbę o findAll i upewnij się, że Sashy nie ma. 6) Zmiana numeru po id
//изменение номера телефона по id
@PutMapping(value = "/change")
public ResponseEntity<?> changeNumberPhone(
//можно добавлять несколько параметров в wniosek
        @RequestParam(value = "id") Integer id, //добавLub один параметр
        @RequestParam(value = "phoneNumber") Integer phoneNumber) //добавLub второй параметр
 {
    BalanceDto byId = balanceService.findById(id);
    byId.setNumberPhone(phoneNumber);
    balanceService.save(byId);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Tworzymy nowe żądanie, wybieramy typ żądania PUT i w wierszu adresu URL wpisujemy: http://localhost:8080/change. W tym żądaniu znajduje się kilka parametrów i jak widać nie przekazujemy ich w linii zapytania jak poprzednio. Adnotacja @RequestParam jest używana dla parametrów metody. Aby przesłać parametry poprzez Postman należy w oknie żądania przejść do zakładki Parametry, w kolumnie Klucz wskazać nazwę parametru (id), a w kolumnie Wartość wskazać wartość (1). To samo robimy z drugim parametrem, Klucz = numer telefonu, Wartość = 888000. Zwróć uwagę na ciąg zapytania, Postman zmienił go, aby poprawnie przekazać parametry. Wyjście pokaże stan OK. Teraz ponownie wykonaj zapytanie findAll i upewnij się, że numer telefonu dla pierwszego wpisu uległ zmianie. 7) Doładuj saldo telefonu
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(
        //можно добавлять несколько параемров в wniosek
        @RequestParam(value = "phoneNumber") Integer phoneNumber,//добавLub один параметр
        @RequestParam(value = "sum") Integer sum) //добавLub второй параметр
{
    balanceService.addingMoneyToBalance(phoneNumber, sum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Tworzymy nowe żądanie, wybieramy typ żądania PUT i w wierszu adresu URL wpisujemy: http://localhost:8080/add. Ustawiamy wartość PhoneNumber na 888000, suma na 130. Na wyjściu pojawi się status OK. Teraz ponownie uruchom żądanie findAll i upewnij się, że zmieniło się saldo pierwszego rekordu. 8) PUT przez treść żądania - lepiej to zrobić, aby nie otworzyć przesyłanych danych
@PutMapping(value = "/add")
public ResponseEntity<?> addingMoney(@RequestBody BalanceDto dto){
    balanceService.addingMoneyToBalance(dto.getPhoneNumber, dto.getSum);
    return ResponseEntity.ok().body(HttpStatus.OK);
}
Wysyłamy JSON
{
        "numberPhone": 888000,
       //  "nameCustomer" можно вообще не указывать
        "balance": 130
}
Na koniec przechodzimy do Cookie. Co to jest plik cookie ? Mówiąc najprościej: pliki cookie przechowują dane otrzymane jednorazowo przez przeglądarkę z aplikacji, które następnie mogą być wielokrotnie wykorzystywane w witrynie. Musisz wiedzieć dwie podstawowe rzeczy: jak pisać i jak czytać Cookie. Jak pisać: Cały Spring Web MVC jest zaimplementowany na bazie interfejsu API serwletu, który jest zbudowany wokół dwóch obiektów — żądanie od klienta jest opakowane w HttpSerlvetRequest, a odpowiedź jest generowana z HttpServletResponse wypełnionego Twoim kodem. Mając dostęp do tych obiektów, masz pełną kontrolę nad całą sesją HTTP. Spring web umożliwia bezpośredni dostęp do tych obiektów. Zwykle Cookie, utwórzmy metodę w kontrolerze
//записать куки
 @GetMapping(value = "/set-cookie")
public ResponseEntity<?> setCookie(HttpServletResponse response) throws IOException {
     Cookie cookie = new Cookie("data", "Come_to_the_dark_side");//создаем obiekt Cookie,
     //в конструкторе указываем значения для name и value
     cookie.setPath("/");//устанавливаем путь
     cookie.setMaxAge(86400);//здесь устанавливается время жизни куки
     response.addCookie(cookie);//добавляем Cookie в wniosek
     response.setContentType("text/plain");//устанавливаем контекст
     return ResponseEntity.ok().body(HttpStatus.OK);//получилось Jak бы два раза статус ответа установLub, выбирайте Jakой вариант лучше
 }
Zróbmy żądanie GET w Postmanie pod adresem: http://localhost:8080/set-cookie, a wynik będzie OK. Nad oknem znajdź napis Cookie(1), klikając na niego zobaczysz pliki Cookies, które wysłaliśmy. Nazwa: dane, wartość: Come_to_the_dark_side. Informacje o głównych cechach klasy Cookie w Javie. Jak czytać: Jeszcze łatwiejszy do odczytania
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
W @CookieValue podajemy nazwę Cookie, którego wartość odczytamy, a odczytaną wartość wyświetlamy w odpowiedzi. Come_to_the_dark_side Nadeszła najlepsza godzina. Nagłówek ( nagłówki , nie patrz na artykuł o PHP, warto go przeczytać): Najpierw zobaczmy, jak możesz przeczytać nagłówki:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а oznaczający мапы - это oznaczający заголовка
    return ResponseEntity.ok(headers);
}
Główną pracę wykonuje @RequestHeader Map<String, String> , reprezentuje on nagłówki w postaci mapy, gdzie kluczem jest nazwa nagłówka, a wartością mapy jest wartość nagłówka. Bardziej interesujące jest przetestowanie tej metody za pomocą przeglądarki, otwórz przeglądarkę, wpisz http://localhost:8080/get-headers w pasku wyszukiwania, a w rezultacie otrzymamy obszerną listę nagłówków. Google każdy nagłówek, aby zrozumieć, dlaczego są potrzebne. Wikipedia oferuje również listę tytułów. „Jeśli ktoś coś przeczytał, to ktoś to zapisał” – głosi stare powiedzenie programistyczne. Zapiszmy tytuł
//записать заголовок
@GetMapping(value = "/set-header")
public ResponseEntity<?> setHeader(){
    return ResponseEntity.ok().header("name-header","value-header").body(HttpStatus.OK);
}
Tutaj użyliśmy specjalnej metody nagłówkowej klasy ResponseEntity . Gdzie „nagłówek-nazwy” to nazwa nagłówka, a „nagłówek-wartości” to wartość nagłówka. Istnieją inne opcje pracy z nagłówkami
//еще варианты работы с заголовками
@GetMapping(value = "/set-headers")
public ResponseEntity<?> setHeaders() {
    HttpHeaders httpHeaders = new HttpHeaders();//создаем obiekt
    //который имплементирует мапу MultiValueMap<String, String>
    //наполняем ее парами ключ-oznaczający
    //можно наполнить своими заголовками через метод add
    httpHeaders.add("customer-header", "value-header1");
    //HttpHeaders так же предлагает большой выбор стандартных заголовков
    //Посмотрите на них набрав в IDEA HttpHeaders.
    httpHeaders.add(HttpHeaders.FROM, "russia");
    //можно изменить существующий заголовок, вызвав для него сет-метод
    httpHeaders.setDate(0);
    //Lub получить oznaczający конкретного заголовка
    Long date = httpHeaders.getDate();
    System.out.println(date);
    return ResponseEntity
            .ok().headers(httpHeaders)//здесь метод принимающий MultiValueMap<String, String>
            .body(HttpStatus.OK);
}
Tutaj używamy innej metody klasy ResponseEntity, która przyjmuje wartość typu MultiValueMap<String, String> . Bardziej pouczające będzie również sprawdzenie, jak to działa w przeglądarce. Udajemy się pod adres http://localhost:8080/set-headers, otrzymujemy odpowiedź, że status jest OK. Jeśli jesteś świetny i korzystasz z Google Chrome to wciśnij kombinację klawiszy Ctrl + Shift + I i przejdź do „Narzędzia programistyczne”, następnie poszukaj w górnym panelu zakładki Sieć , klikając ją, poszukaj wpisu: set-headers ( jeśli go tam nie ma, odśwież stronę) kliknij tam i w oknie, które się otworzy, wybierz zakładkę Nagłówki i w ResponseHeaders widzimy nasze nagłówki. Aby zapoznać się z nagłówkami, na razie wystarczy. Teraz przeczytaj: Studiowanie ResponseEntity<!--?--> i pozbycie się go w kontrolerach Spring W związku z tym pozwól mi odejść 🤓, do zobaczenia ponownie...
Komentarze
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION