JavaRush /Java 博客 /Random-ZH /春天并不可怕。Cookie 和标头
Павел
第 11 级

春天并不可怕。Cookie 和标头

已在 Random-ZH 群组中发布
文章循环的内容 重复是学习之母!因此,在之前文章的基础上,我们新建一个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, numberPhone 111000, Balance 60, customer 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
}
最后我们继续讨论 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