Servlet API 获取请求数据

news2024/11/16 8:28:05

目录

      • 一. 构造HTTP请求的方式
            • 1.1 使用 Postman 来构造请求
            • 1.2 使用ajax 来构造请求
      • 二 . HttpServletRequest API
            • 使用api实现前后端交互
            • 1 . 通过 GET 请求 query string 进行传参
            • 2 . POST请求 form 表单传参 (body)
            • 3 . Post 请求的 json 格式的数据传参(body)

一. 构造HTTP请求的方式

1.1 使用 Postman 来构造请求
import javax.jws.WebService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.HttpCookie;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: snutyx
 * Date: 2023-03-19
 * Time: 17:07
 */
@WebServlet("/method")
public class MethodServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doGet()");
        resp.getWriter().write("doGet()");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPost");
        resp.getWriter().write("doPost()");
    }

    @Override
    protected void doPut(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doPut()");
        resp.getWriter().write("doPut()");
    }

    @Override
    protected void doDelete(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("doDelete()");
        resp.getWriter().write("doDelete()");

    }
}

  • 启动tomcat服务器

image-20230319172429104

  • 启动成功 , 构造请求
    • 构造 get 请求

image-20230319172524204

返回响应

image-20230319172553288

image-20230319172621476

image-20230319172635839

image-20230319172650911

image-20230319172708936

image-20230319172731520

image-20230319172745826

postman 是我们在后端开发过程中非常好用的工具 ,后端在公司中主要就是实现一些 http 接口 , 前端发送对应的请求 , 后端就通过 postman 进行验证和测试 。

1.2 使用ajax 来构造请求
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!-- 使用这个页面来构造 ajax 请求 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <script>
        $.ajax({
            type:'get',
            //相对路径的写法 : url : 'method',
            //绝对路径的写法 :
            url: '/hello_servlet/method',
            success:function(body,status){
                console.log(body);
            }
        });
    </script>
</body>
</html>

image-20230319174930761

image-20230319174952915

同理 , 构造post请求, 只需要修改对应的 type即可 。

编写 tomcat 代码时 , 每次修改都需要重新启动服务器

<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!-- 使用这个页面来构造 ajax 请求 -->
    <script src="https://cdn.bootcdn.net/ajax/libs/jquery/3.6.4/jquery.min.js"></script>
    <script>
        $.ajax({
            type:'post',
            //相对路径的写法 : url : 'method',
            //绝对路径的写法 :
            url: '/hello_servlet/method',
            success:function(body,status){
                console.log(body);
            }
        });
    </script>
</body>
</html>

image-20230319175057815

image-20230319175113387

二 . HttpServletRequest API

  • 常用方法
方法描述
String getProtocol()返回请求协议的名称和版本。
String getMethod()返回请求的 HTTP 方法的名称,例如,GET、POST 或 PUT。
String getRequestURI()从协议名称直到 HTTP 请求的第一行的查询字符串中,返回该请求的 URL 的一部分。
String getContextPath()返回指示请求上下文的请求 URI 部分。
String getQueryString()返回包含在路径后的请求 URL 中的查询字符串。
Enumeration getParameterNames()返回一个 String 对象的枚举,包含在该请求中包含的参数的名称。
String getParameter(String name)以字符串形式返回请求参数的值,或者如果参数不存在则返回 null。
String[] getParameterValues(String name)返回一个字符串对象的数组,包含所有给定的请求参数的值,如果参数不存在则返回 null。
Enumeration getHeaderNames()返回一个枚举,包含在该请求中包含的所有的头名。
String getHeader(String name)以字符串形式返回指定的请求头的值。
String getCharacterEncoding()返回请求主体中使用的字符编码的名称。
String getContentType()返回请求主体的 MIME 类型,如果不知道类型则返回 null。
int getContentLength()以字节为单位返回请求主体的长度,并提供输入流,或者如果长度未知则返回 -1。
InputStream getInputStream()用于读取请求的 body 内容。返回一个 InputStream 对象。

使用 HttpServletRequest API 来简单获取一个HTTP 请求的内容

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;

/**
 * 测试 HttpServlet 中的相关 api 
 */
@WebServlet("/showRequest")
public class ShowRequestServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 这里是设置响应的 content-type. 告诉浏览器, 响应 body 里的数据格式是啥样的.
        resp.setContentType("text/html");

        // 搞个 StringBuilder, 把这些 api 的结果拼起来, 统一写回到响应中.
        StringBuilder stringBuilder = new StringBuilder();
        stringBuilder.append(req.getProtocol());
        stringBuilder.append("<br>");
        stringBuilder.append(req.getMethod());
        stringBuilder.append("<br>");
        stringBuilder.append(req.getRequestURI());
        stringBuilder.append("<br>");
        stringBuilder.append(req.getContextPath());
        stringBuilder.append("<br>");
        stringBuilder.append(req.getQueryString());
        stringBuilder.append("<br>");
        stringBuilder.append("<br>");
        stringBuilder.append("<br>");
        stringBuilder.append("<br>");

        // 获取到 header 中所有的键值对
        Enumeration<String> headerNames = req.getHeaderNames();
        while (headerNames.hasMoreElements()) {
            String headerName = headerNames.nextElement();
            stringBuilder.append(headerName + ": " + req.getHeader(headerName));
            stringBuilder.append("<br>");
        }

        resp.getWriter().write(stringBuilder.toString());
    }
}

响应结果 :

image-20230319182056724

使用api实现前后端交互

image-20230319184957393

使用 getParameter() 方法 , 既可以获取 GET 请求中 query string 中的键值对 , 也可以获取 POST 请求中的 form 表单构造的 body 中的键值对

1 . 通过 GET 请求 query string 进行传参

通过前端给后端传入数据 , studentId 和 classId

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: snutyx
 * Date: 2023-03-19
 * Time: 18:43
 */
@WebServlet("/getParameter")
public class GetParameterServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 预期浏览器会发一个形如 /getParameter?studentId=10&classId=20 请求.
        // 借助 req 里的 getParameter 方法就能拿到 query string 中的键值对内容了.
        // getParameter 得到的是 String 类型的结果.
        String studentId = req.getParameter("studentId");
        String classId = req.getParameter("classId");
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("学生ID = "+studentId+"班级ID = "+ classId);
    }
}

当设置的 url 的querystring 为空时 :

image-20230319185151461

query string 不为空时

image-20230319185341047

这里的query string 键值对 ,会自动被tomcat处理成 Map这样的结构 , 后续就可以随时通过 key 获取 value , 如果key 在query string 中不存在 ,返回 null .

2 . POST请求 form 表单传参 (body)
<!doctype html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport"
          content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <!-- 这里的 action 指的是路径,规定当提交表单时向何处发送表单数据。
               method 规定用于发送 form-data 的 HTTP 方法 -->
    <form action="postParameter" method="post">
        <input type="text" name="studentId">
        <input type="text" name="classId">
        <input type="submit" value="提交">
    </form>
</body>
</html>

image-20230319191153084

此时点击提交之后就构造出了一个 post 请求 , post请求的 body就是form表单中的内容 , 此时通过 Fiddler 抓包就可以完整的显示出请求报文

因为此时我们还未编写 postParameter , 所以此时的页面显示 404

image-20230319192149460

image-20230319192234209

form 表单中的 action 决定了路径 , method 决定了 http请求的类型, input中的name 决定了body中的键值对 中key , 提交的内容决定了 body中的键值对 中value;

image-20230319192715518

Content-type决定了这是由 form 表单构成的请求 。

后端 PostParameter 代码:

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: snutyx
 * Date: 2023-03-19
 * Time: 19:29
 */
@WebServlet("/postParameter")
public class PostParameterServlet  extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String studentId = req.getParameter("studentId");
        String classId = req.getParameter("classId");
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write("学生Id = "+ studentId+"班级Id = "+ classId);
    }
}

image-20230319193653258

3 . Post 请求的 json 格式的数据传参(body)

json 是一种非常主流的数据格式 , 也是键值对结构 , 通过使用 getInputStream() 来获取 请求的流对象 , 再将流对象存入字节数组当中,最后构造成字符串之后打印出来 。

import sun.awt.windows.WBufferStrategy;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;

@WebServlet("/postparameter2")
public class PostParameter2Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        此方法用来处理 body 为 json 格式的数据。
//        直接把 req 对象里的 body  完整的读取出来
//        使用 getInputStream 来获取 body 的内容并返回一个流对象
//        流对象中的字节数目取决于 content-length
          int length = req.getContentLength();
          byte[] buffer = new byte[length];
//      读取操作
        InputStream inputStream = req.getInputStream();
//        读取到的字节传入 buffer  数组当中
        inputStream.read(buffer);
//        把字节数组构造成 string 打印出来
        String body = new String(buffer,0,length,"utf8");
        System.out.println("body =  "+body);
        resp.getWriter().write(body);
    }
}

此处我们可以使用 ajax 来构造请求 , 同时也可以使用 postman 来构造请求 ,进行处理 post 请求中的 body 中 json 格式 , 最后返回响应 。

  • 使用 postman 构造 指定post 请求 , body 就是 json 数据

image-20230404195552816

使用 fiddler 进行抓包 , 得到的请求报文的格式如下

请求到达 tomcat , tomcat 解析成 req 对象 , 在servlet 代码当中 req. getInputStream() 读取 body 的内容 , 将 body 的内容转化为 字符串 写入响应 的body 并返回给客户端,显示在浏览器当中 。

控制台打印 body 的内容 , 并返回响应给客户端(postman)

image-20230404201609281

image-20230404201508914

使用 json 格式的数据与 form 表单传参有一定的区别 , 但是三种方式基本是等价的 。

//form 表单传参
studentId=20 && classId=10
//json 格式的传参
{
   "studentId" : 20,
   "classId" : 10
}

但是通过 json 进行传递数据,服务器这边只是把整个 body 读出来, 没有按照键值对的方式进行处理,还不能够通过 key 获取 value , form 表单可以通过 key 来获取value , 此时就需要引入第三库来解析 json 格式 ,比如 jackson ,gson 等

  • 引入 jackson 来解析json格式

通过 maven 来引入第三方库 ,中央仓库中搜索 jackson ,找到Jackson DataBind

image-20230404203455410

选择合适的版本,此处我们选择 2.14.1

image-20230404203701606

将 一下内容复制到 pom.xml 中的 与结构之间,然后进行手动刷新,等待加载和配置 。

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.core/jackson-databind -->
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.14.1</version>
</dependency>

配置完成之后 , 重新编写服务器的相关代码 ,

import com.fasterxml.jackson.databind.ObjectMapper;
import sun.awt.windows.WBufferStrategy;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
// 创建一个 student 类 , 属性名字需要和 json 中的key 一致
// 也可以写为  private ,但是需要提供 getter and setter 方法	
class Student{
    public int studentId;
    public int classId;
}

@WebServlet("/postparameter2")
public class PostParameter2Servlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
y);
//         使用 jackson 涉及到的核心对象 。
        ObjectMapper objectMapper = new ObjectMapper();
//         readvalue  就是把一个json 格式的字符串转化为 Java 对象
        Student student = objectMapper.readValue(req.getInputStream(),Student.class);
        System.out.println(student.studentId+ "," + student.classId);

//        返回响应
        resp.getWriter().write("studentId: "+student.studentId+","+"classId: "+student.classId);

    }
}

上述代码的核心代码就是将 一个 json 格式的字符串 转化为一个 java 对象 ,并赋予其相关属性 。

image-20230405100953380

  • 使用 req.getInputStream ()获取到的 json 格式的字符串
  • 根据第二个参数对象创建 student 实例 。
  • 通过这个类对象, 在 readValue 的内部就可以借助反射机制来构造出 Student 对象, 并将上树的字符串处理成 map 键值对结构。
  • 遍历所有键值对,并且根据键值对中key 的名字, 把对应的 value 赋值给 student 的对应字段
  • 返回该 student 实例

使用 postman 构造 指定post 请求

image-20230405103605795

控制台打印 student 相关属性

image-20230405103827797

响应成功 ,通过 key 获取到 value 的值

image-20230405103735409

如果 json 格式中的属性在实现的类中不包含会出现什么情况 ?

响应如下 : 因为存在为定义的属性, 所以服务器端解析错误 。

image-20230405143413767

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/547197.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多激光雷达手眼标定

手眼标定方法已经有很多博客进行解析&#xff0c;但是都是针对机器人的手&#xff08;夹爪&#xff09;眼睛&#xff08;相机&#xff09;进行标定。例如&#xff1a; 标定学习笔记&#xff08;四&#xff09;-- 手眼标定详解 手眼标定_全面细致的推导过程 本文主要描述多激光…

【c语言】文件的光标操作

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c语言系列专栏&#xff1a;c语言之路重点知识整合 &#x…

Java --- 云尚办公角色管理模块实现

目录 一、项目介绍 1.1、项目简介 1.2、技术框架 1.3、项目构建 1.4、配置依赖 二、mybatis-plus测试使用 三、角色管理 3.1、完善统一返回信息 3.2、整合knife4j 3.3、分页查询功能 3.4、添加、修改、删除功能 3.5、完善时间格式 3.6、异常统一处理 四、前端知识 4.1…

LeetCode662.设计循环队列||4种方法实现

目录 题目 思路1(链表) 代码 思路2(数组) 代码 题目 题目要求的队列需要实现的功能有 ①Creat---设置队列长度 ②Front---获取队列头 ③Rear---获取队列尾 ④en----插入元素 ⑤de---删除元素 ⑥empty---判空 ⑦full---判满 思路1(链表) &#x1f50d;普通队列长度没有限制&…

MySQL高级——第16章_多版本并发控制

第16章_多版本并发控制 1. 什么是MVCC MVCC &#xff08;Multiversion Concurrency Control&#xff09;&#xff0c;多版本并发控制。顾名思义&#xff0c;MVCC 是通过数据行的多个版本管理来实现数据库的 并发控制 。这项技术使得在InnoDB的事务隔离级别下执行 一致性读 操…

ARM学习笔记_1 介绍,Keil环境搭建

从零开始学ARM 学习自b站一口linux老师的课程。 文章目录 从零开始学ARM介绍为什么要学汇编&#xff1f;ARM是什么&#xff1f;SOC计算机历史冯诺依曼结构介绍哈佛架构介绍混合架构介绍CPU运行原理 环境搭建 介绍 学习ARM需要学计算机原理&#xff0c;汇编&#xff0c;C语言&…

强大,Midjourney Imagine API接口,AI画画的福音!

前几天跟大家分享过一篇 ”让chatGPT教你AI绘画|如何将chatGPT与Midjourney结合使用&#xff1f;“&#xff0c;但是由于许多小伙伴们使用Midjourney还有许多困难&#xff0c;又要上网&#xff0c;还要注册Discord&#xff0c;MJ的使用成本很高&#xff0c;让大家望而却步&…

【计算机视觉 | 目标检测】目标检测中的评价指标 mAP 理解及计算(含示例)

文章目录 一、目标检测的评价指标1.1 Precision1.2 Recall1.3 Average Precision&#xff08;AP&#xff09;1.4 mean Average Precision&#xff08;mAP&#xff09;1.5 Intersection over Union&#xff08;IoU&#xff09;1.6 F1-score 二、基础知识2.1 Precision2.2 Recall…

5.20下周黄金行情走势分析及开盘独家交易策略

近期有哪些消息面影响黄金走势&#xff1f;下周黄金多空该如何研判&#xff1f; ​黄金消息面解析&#xff1a;周五(5月19日)&#xff0c;现货黄金价格下跌又反弹&#xff0c;现货黄金持续走高美联储主席鲍威尔&#xff1a;那些积极的供应冲击不太可能重复出现&#xff0c;美联…

初阶数据结构之单链表的实现(四)

文章目录 链表的概念及结构一、链表的逻辑结构是什么样的&#xff1f;二、链表的初始化2.1链表初始化的示意2.2链表初始化代码实现 三、链表的各类接口函数定义四、链表的各类接口函数的代码实现4.1链表的打印代码实现4.1.1打印代码的实现 4.2链表的尾插代码实现4.2.1尾插代码实…

Mongodb 6.0 变化的配置参数与连接的方式变化

开头还是介绍一下群&#xff0c;如果感兴趣polardb ,mongodb ,mysql ,postgresql ,redis 等有问题&#xff0c;有需求都可以加群群内有各大数据库行业大咖&#xff0c;CTO&#xff0c;可以解决你的问题。加群请联系 liuaustin3 &#xff0c;在新加的朋友会分到2群&#xff08;共…

【故障排查】【伪处理】Jenkins在iframe窗口无法添加secret text凭证

问题描述 环境的ingress是&#xff0c;有个 svc 暴露 30080 -> 80 大致流程&#xff1a; svc&#xff08;ingress-nginx&#xff09; 30080端口 -> pod (nginx-ingress-controller ) 80端口 -> ingress -> svc -> pod &#xff08;Jenkins 8080端口&#xff0…

基于粒子群优化算法的路径问题优化研究及其在Python中的实现

基于粒子群优化算法的路径问题优化研究及其在Python中的实现 文章目录 基于粒子群优化算法的路径问题优化研究及其在Python中的实现一、简介二、引言1、粒子群优化算法简介2、PSO算法与鸟群的类比 三、PSO算法数学原理1、粒子的位置和速度2、适应度函数3、粒子的个体最优和全局…

基于html+css的图展示80

准备项目 项目开发工具 Visual Studio Code 1.44.2 版本: 1.44.2 提交: ff915844119ce9485abfe8aa9076ec76b5300ddd 日期: 2020-04-16T16:36:23.138Z Electron: 7.1.11 Chrome: 78.0.3904.130 Node.js: 12.8.1 V8: 7.8.279.23-electron.0 OS: Windows_NT x64 10.0.19044 项目…

从零开始搭建属于自己的hexo博客

前提要素&#xff1a;一个提供博客运行的服务器或者XX云。 先展示一下搭建好的样子&#xff0c;给大家一点动力&#xff1a; 整个搭建过程大概需要30分钟不到&#xff0c;请各位控制自己的时间~ 好了&#xff0c;废话不多说我们开始&#xff01; 1、首先登录我们准备好的服…

redis高级篇二(分片集群)

一)进行测试Sentinel池: ​ Controller public class RestController {RequestMapping("/Java100")ResponseBodypublic String start(){//1.配置信息HashSet<String> setnew HashSet<>();// 连接信息 ip:port// set.add("127.0.0.1:27001");se…

[抓包] 微信小程序(PC版)如何抓包

本文抓包环境 Win10&#xff0c;微信(PC版本) v3.9.2.20&#xff0c;Burp Suite v1.7.32&#xff0c;Proxifier v3.42 不使用安卓模拟器 一、下载安装好Burp Suite&#xff0c;Proxifier 链接: https://pan.baidu.com/s/177BIEgCmZG9MfqQ4D0PTsg 提取码: 3hex 二、开始抓包 …

【ASP.NET Core笔记】 使用razor pages构建网站

使用ASP.NET Core Razor Pages 构建网站 sqlite 北风数据库 1. Northwind.Common.DataContext.Sqlite 是Sqlite的数据库上下文&#xff0c;有三个类&#xff1a;ConsoleLogger.csNorthwindContext.csNorthwindContextExtensions.cs 1.1 NorthwindContext 继承自 Microsoft.Enti…

计算机图形学-GAMES101-10

一、纹理 原模型网格->逐面Shading->逐像素Phong Shading->纹理贴图->换个纹理再贴图->环境光照。 &#xff08;1&#xff09;环境贴图 纹理就是一张图&#xff0c;纹理是GPU里的一块内存&#xff0c;可以进行点查询、范围查询、滤波。  环境光贴图、环境光映…

The authenticity of host ‘gitee.com (212.64.63.190)‘ can‘t be established.

在将本地仓库的代码推送到远程仓库时&#xff0c;出现下面报错。 $ git push -u origin master The authenticity of host gitee.com (212.64.63.190) cant be established. ECDSA key fingerprint is SHA256:FQGC9Kn/eye1W8icdBgrQpKkGYoFgbVr17bmjey0Wc. Are you sure you w…