JavaRush /Java Blog /Random-KO /봄은 무섭지 않아요. 쿠키 및 헤더
Павел
레벨 11

봄은 무섭지 않아요. 쿠키 및 헤더

Random-KO 그룹에 게시되었습니다
기사 주기의 내용 반복은 배움의 어머니입니다! 따라서 이전 기사를 기반으로 새로운 웹 스프링 부트 프로젝트인 MobilePhonePayment Connect h2, Lombok을 만들어 보겠습니다. 엔터티 레이어 생성: BalancePhoneEntity Integer id; 정수번호전화번호; 문자열 이름고객; 정수 잔액; 다음 방법을 사용하여 서비스 계층을 만듭니다. - 데이터베이스의 모든 기록 검색 - ID로 기록 검색 - 전화번호로 기록 검색 - 사용자 이름으로 기록 검색(기록 시트를 반환해야 하며, 이름은 동일하다)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- 데이터베이스에 기록 추가 - ID별로 데이터베이스에서 기록 제거 - 업무 방식: 휴대폰 잔액 충전 - 전화번호, 금액(정수형)을 가져와서 해당 번호의 잔액을 지정된 만큼 증가시키는 방식입니다. 양.
public void addingMoneyToBalance(Integer phoneNumber, Integer sum) {
    BalanceDto byPhoneNumber = findByPhoneNumber(phoneNumber);
    byPhoneNumber.setBalance(byPhoneNumber.getBalance() + sum);
    save(byPhoneNumber);//метод save() – добавление, реализован в сервисе
}
DTO에서 엔터티로의 매핑을 구현하는 것을 잊지 마세요. Dto는 Entity: BalancePhoneDto Integer id 와 유사합니다 . 정수번호전화번호; 문자열 이름고객; 정수 잔액; DTO 레이어를 생성하고 InitiateUtils 클래스를 생성하고 데이터베이스를 데이터로 채웁니다: id 1, numberPhone 555000, 잔액 100, 고객 Ivan id 2, numberPhone 444000, 잔액 250, 고객 Marya id 3, numberPhone 111000, 잔액 60, 고객 Ivan Create 나머지 컨트롤러를 사용하되 서두르지 말고 메소드로 채우세요. 이전 기사를 따랐다면 모든 기록을 표시하는 방법은 다음과 같았을 것입니다. (이제 기사에 대한 의견, 특히 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);
}
생성자를 사용하지 않고 ResponseEntity를 사용하는 또 다른 방법이 있습니다. 우리는 그것을 계속 사용할 것입니다. ResponseEntity는 HeadersBuilder와 해당 하위 인터페이스인 BodyBuilder라는 두 개의 중첩 빌더 인터페이스를 노출합니다. 따라서 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을 작성해 보겠습니다. 쿼리 라인에 name 매개 변수를 전달했으며 출력에서 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 이는 오류가 아닙니다. 이는 요청 인코딩의 기능이므로 자세히 읽어보세요 . 그리고 여기에는 이런 일이 발생하지 않도록 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 형식의 개체를 전달해야 합니다. 요청 창에서 본문 탭으로 이동하여 플래그를 원시로 설정하고 텍스트 옆에 있는 화살표를 클릭한 후 JSON을 선택합니다. 다음 JSON을 창에 복사합니다.
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
요청 실행을 클릭하면 응답 상태가 CREATED가 됩니다. 이제 findAll을 다시 쿼리하여 새 항목이 나타나는지 확인하세요. 5) ID별 항목 삭제
//удаление записи по 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에 대한 또 다른 요청을 작성하고 Sasha가 누락되었는지 확인하십시오. 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 주석은 메소드의 매개변수에 사용됩니다. Postman을 통해 매개변수를 전송하려면 요청 창의 Params 탭으로 이동하여 Key 열에 매개변수 이름(id)을 표시하고 Value 열에 값(1)을 표시해야 합니다. 두 번째 매개변수인 Key =phoneNumber, Value = 888000에도 동일한 작업을 수행합니다. 쿼리 문자열에 주의하세요. 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으로 설정하고 합계를 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
}
마지막으로 쿠키로 넘어갑니다. 쿠키 란 무엇입니까 ? 간단히 말하면, 쿠키는 브라우저가 애플리케이션으로부터 한 번 수신한 데이터를 저장한 다음 사이트에서 반복적으로 사용할 수 있습니다. 쿠키를 작성하는 방법과 읽는 방법이라는 두 가지 기본 사항을 알아야 합니다. 작성 방법: 전체 Spring Web MVC는 두 개체를 중심으로 구축된 Servlet API 위에 구현됩니다. 클라이언트의 요청은 HttpSerlvetRequest로 래핑되고 응답은 코드로 채워진 HttpServletResponse에서 생성됩니다. 이러한 개체에 액세스하면 전체 HTTP 세션을 완전히 제어할 수 있습니다. Spring 웹을 사용하면 이러한 객체에 직접 액세스할 수 있습니다. 보통 쿠키인데 컨트롤러에 메소드를 만들어 봅시다
//записать куки
 @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ой вариант лучше
 }
Postman에서 http://localhost:8080/set-cookie 주소로 GET 요청을 하면 출력이 정상이 됩니다. 창 위에서 쿠키(1)라는 문구를 찾으세요. 이를 클릭하면 우리가 보낸 쿠키를 볼 수 있습니다. 이름: 데이터, 값: Come_to_the_dark_side. Java의 Cookie 클래스 의 주요 기능에 대한 정보입니다 . 읽는 방법: 더 쉽게 읽을 수 있습니다.
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
@CookieValue에는 값을 읽을 쿠키의 이름을 나타내고 읽은 값을 응답에 표시합니다. Come_to_the_dark_side 이제 최고의 시간이 왔습니다 헤더 ( 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를 입력하면 결과적으로 광범위한 헤더 목록을 얻는 것이 더 흥미롭습니다. Google에서 각 제목이 필요한 이유를 이해하세요. Wikipedia에서는 제목 목록도 제공합니다. “누군가가 뭔가를 읽으면 누군가 그것을 적는다”는 오래된 프로그래밍 속담입니다. 제목을 적어보자
//записать заголовок
@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);
}
여기서는 MultiValueMap<String, String> 유형의 값을 사용하는 ResponseEntity 클래스 의 또 다른 메서드를 사용합니다 . 또한 브라우저에서 어떻게 작동하는지 확인하는 것이 더 유익할 것입니다. http://localhost:8080/set-headers 주소로 이동하면 상태가 OK라는 응답을 받습니다. 훌륭하고 Google Chrome을 사용하는 경우 Ctrl + Shift + I 키 조합을 누르고 "개발자 도구"로 이동한 다음 상단 패널에서 네트워크 탭을 찾습니다 . 클릭하여 항목을 찾습니다. 헤더 설정 ( 없으면 페이지를 새로 고치십시오.) 거기를 클릭하고 열리는 창에서 헤더 탭을 선택하면 ResponseHeaders 에 헤더가 표시됩니다. 헤드라인을 알아보려면 지금은 이것으로 충분합니다. 이제 읽어보세요: ResponseEntity<!--?-->를 연구하고 Spring 컨트롤러에서 제거하기 이제 이만 이만 물러가겠습니다 🤓, 다시 만나요...
코멘트
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION