JavaRush /Java Blog /Random-TW /春天並不可怕。Cookie 和標頭
Павел
等級 11

春天並不可怕。Cookie 和標頭

在 Random-TW 群組發布
文章循環的內容 重複是學習之母!因此,在先前文章的基礎上,我們新建一個web spring-boot專案:MobilePhonePayment Connect h2,Lombok。建立實體層: BalancePhoneEntity Integer id;整數電話號碼;字串名稱客戶;整數餘額; 使用以下方法建立服務層: - 搜尋資料庫中的所有記錄 - 按 id 搜尋記錄 - 按電話號碼搜尋記錄 - 按使用者名稱搜尋記錄(應傳回一張記錄,名稱可以是相同的)
public List<BalanceEntity> findByNameCustomer(String nameCustomer){
    return balanceRepository.findAllByNameCustomer(nameCustomer);
}
- 在資料庫中新增一筆記錄 - 透過id從資料庫中刪除一筆記錄 - 業務方法:儲值手機餘額 - 此方法必須取一個電話號碼,一個金額(Integer類型)並將對應號碼的餘額增加指定的值數量。
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, customer Ivan id 2, numberPhone 444000, Balance 250, customer Marya id 3, nomerban 11160, 一個休息控制器,但不要急於用方法填充它。如果您遵循上一篇文章,那麼顯示所有記錄的方法應該是這樣的(我建議現在查看該文章的評論 - 特別是 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
}
最後我們繼續討論 Cookie。 什麼是Cookie?簡而言之:Cookie 儲存瀏覽器從應用程式接收的數據,然後可以在網站上重複使用。您需要了解兩個基本知識:如何編寫和如何讀取 Cookie。 如何編寫: 整個 Spring Web MVC 是在 Servlet API 之上實現的,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ой вариант лучше
 }
讓我們在 Postman 中發出 GET 請求,位址為:http://localhost:8080/set-cookie,輸出就可以了。在視窗上方,找到 Cookie(1) 字樣,點擊它您將看到我們發送的 Cookie。名稱:數據,值: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中,我們指定要讀取其值的Cookie的名稱,並在回應中顯示讀取的值。 Come_to_the_dark_side 現在最好的時刻到了 Headerheaders,別看 PHP 的文章了,讀起來還是很有用的): 首先,讓我們看看如何讀取 headers:
//прочитать заголовки
@GetMapping(value = "/get-headers")
public ResponseEntity<?> getHeaders(@RequestHeader Map<String, String> headers){//представляет заголовки ввиде мапы,
    //где ключ это наименование заголовка, а meaning мапы - это meaning заголовка
    return ResponseEntity.ok(headers);
}
主要工作是由@RequestHeader Map<String, String>完成的,它以 Map 的形式表示 headers,其中 key 是 header 的名稱,map 的 value 是 header 的值。使用瀏覽器測試此方法更有趣,打開瀏覽器,在搜尋欄中輸入 http://localhost:8080/get-headers,結果我們得到了廣泛的標頭列表。谷歌每個標題以了解為什麼需要它們。維基百科也提供了標題清單。 「如果有人讀過一些東西,就會有人把它寫下來」是一句古老的程式設計諺語。 讓我們寫下標題
//записать заголовок
@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 (如果不存在,請刷新頁面)單擊此處,然後在打開的視窗中選擇“標頭”選項卡,然後在ResponseHeaders中我們會看到我們的標頭。熟悉頭條新聞現在就足夠了。現在閱讀:研究 ResponseEntity<!--?--> 並在 Spring 控制器中擺脫 它就 這樣,讓我告辭🤓,再見...
留言
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION