JavaRush /จาวาบล็อก /Random-TH /ฤดูใบไม้ผลิไม่น่ากลัว คุกกี้และส่วนหัว
Павел
ระดับ

ฤดูใบไม้ผลิไม่น่ากลัว คุกกี้และส่วนหัว

เผยแพร่ในกลุ่ม
เนื้อหาของวงจรของบทความ การทำซ้ำเป็นแม่ของการเรียนรู้! ดังนั้น จากบทความก่อนหน้านี้ มาสร้างโปรเจ็กต์ web spring-boot ใหม่: 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 ไปยังเอนทิตีและด้านหลัง Dto จะคล้ายกับ Entity: BalancePhoneDto Integer id; เลขจำนวนเต็มโทรศัพท์; ชื่อสตริงลูกค้า; ความสมดุลของจำนวนเต็ม สร้างเลเยอร์ DTO สร้างคลาส InitiateUtils และเติมฐานข้อมูลด้วยข้อมูล: id 1, numberPhone 555000, balance 100, ลูกค้า Ivan id 2, numberPhone 444000, balance 250, ลูกค้า Marya id 3, numberPhone 111000, balance 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
@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 ในบรรทัดแบบสอบถาม ในผลลัพธ์ที่เราจะได้รับรายการด้วย รหัสเท่ากับ 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 - เราส่งพารามิเตอร์ชื่อในบรรทัดแบบสอบถามและในผลลัพธ์เราจะ รับรายการบันทึกที่มี 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 นี่ไม่ใช่ข้อผิดพลาด - นี่คือคุณสมบัติของการเข้ารหัสคำขอ โปรดอ่านรายละเอียด และนี่คือวิธีกำหนดค่าบุรุษไปรษณีย์เพื่อไม่ให้สิ่งนี้เกิดขึ้น 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 ในหน้าต่างคำขอ ให้ไปที่แท็บเนื้อหา ตั้งค่าสถานะเป็น Raw คลิกลูกศรถัดจากข้อความ และเลือก JSON คัดลอก JSON ต่อไปนี้ลงในหน้าต่าง:
{
        "numberPhone": 767676,
        "nameCustomer": "Sasha",
        "balance": 100
}
เมื่อเราคลิกดำเนินการตามคำขอ สถานะการตอบสนองจะถูกสร้างขึ้น ตอนนี้ค้นหา 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 ในบรรทัดคำขอ เราได้รับสถานะตกลงในเอาต์พุต . ตอนนี้ให้ส่งคำขออีกครั้งเพื่อค้นหาทั้งหมดและตรวจสอบให้แน่ใจว่า Sasha หายไป 6) การเปลี่ยนหมายเลขด้วยรหัส
//изменение номера телефона по 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 ใช้สำหรับพารามิเตอร์ในวิธีการ หากต้องการถ่ายโอนพารามิเตอร์ผ่านบุรุษไปรษณีย์ คุณต้องไปที่แท็บ Params ในหน้าต่างคำขอ ระบุชื่อของพารามิเตอร์ (id) ในคอลัมน์คีย์ และระบุค่า (1) ในคอลัมน์ค่า เราทำเช่นเดียวกันกับพารามิเตอร์ตัวที่สอง Key = phoneNumber, Value = 888000 ให้ความสนใจกับสตริงการสืบค้น Postman เปลี่ยนให้ส่งพารามิเตอร์ได้อย่างถูกต้อง ผลลัพธ์จะแสดงสถานะตกลง ตอนนี้ค้นหา 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) ส่งผ่านเนื้อหาคำขอ - ควรทำเช่นนี้เพื่อไม่ให้เปิดข้อมูลที่ส่ง
@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 ช่วยให้คุณเข้าถึงวัตถุเหล่านี้ได้โดยตรง โดยปกติแล้ว 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ой вариант лучше
 }
มาส่งคำขอ GET ในบุรุษไปรษณีย์ตามที่อยู่: http://localhost:8080/set-cookie แล้วผลลัพธ์จะเป็นปกติ เหนือหน้าต่างค้นหาคุกกี้ที่จารึกไว้ (1) โดยคลิกที่มันคุณจะเห็นคุกกี้ที่เราส่งไป ชื่อ: ข้อมูล ค่า: Come_to_the_dark_side ข้อมูลเกี่ยวกับคุณสมบัติหลักของคลาส Cookie ใน java วิธีอ่าน: อ่านง่ายยิ่งขึ้น
//прочитать куки
@GetMapping(value = "/get-cookie")
public ResponseEntity<?> readCookie(@CookieValue(value = "data") String data) {
    return ResponseEntity.ok().body(data);
}
ใน @CookieValue เราระบุชื่อของ Cookie ที่เราจะอ่านค่า และแสดงค่าที่อ่านในการตอบกลับ Come_to_the_dark_side ตอนนี้ชั่วโมงที่ดีที่สุดมาถึงแล้ว Header ( 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);
}
ที่นี่เราใช้วิธีอื่นของคลาส ResponseEntityซึ่งรับค่าประเภทMultiValueMap<String, String > จะมีข้อมูลมากกว่านี้ในการตรวจสอบว่ามันทำงานอย่างไรในเบราว์เซอร์ เราไปที่ที่อยู่ http://localhost:8080/set-headers เราได้รับการตอบกลับว่าสถานะไม่เป็นไร หากคุณเก่งและใช้ Google Chrome ให้กดคีย์ผสมCtrl + Shift + Iแล้วไปที่ “เครื่องมือสำหรับนักพัฒนา” จากนั้นมองหาแท็บเครือข่าย ในแผงด้านบน โดยการคลิกเพื่อค้นหารายการ: set-headers ( หากไม่มีอยู่ ให้รีเฟรชหน้า) คลิกตรงนั้น และในหน้าต่างที่เปิดขึ้นมา เลือก แท็บ HeadersและในResponseHeadersเราจะเห็นส่วนหัวของเรา เพื่อทำความคุ้นเคยกับหัวข้อข่าวก็เพียงพอแล้วสำหรับตอนนี้ อ่านแล้ว: กำลังศึกษา ResponseEntity<!--?--> และกำจัดมันใน Spring controllers ด้วยเหตุนี้ ฉันขอลาก่อน 🤓 แล้วพบกันใหม่...
ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION