二刷 苍穹外卖 day06

HttpClient

用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包
作用:
发送HTTP请求
接受响应数据

应用场景:
当我们在使用扫描支付、查看地图、获取验证码、查看天气等功能时
其实,应用程序本身并未实现这些功能,都是在应用程序里访问提供这些功能的服务,访问这些服务需要发送HTTP请求,并且接收响应数据,可通过HttpClient来实现。

核心API:
HttpClient:Http客户端对象类型,用该类型对象可发起Http请求
HttpClients:构建器,可创建HttpClient对象
CloseableHttpClient:实现类实现了HttpClinet接口
HttpGet:Get方式请求类型
HttpPost:Post方式请求类型

发送请求步骤:
创建HttpClient对象
创建Http请求对象
调用HttpClient的execute方法发送请求对象

入门案例

GET请求

@Test  
public void testGET() throws Exception{  CloseableHttpClient httpClient = HttpClients.createDefault();  HttpGet httpGet = new HttpGet("http://localhost:8080/user/shop/status");  CloseableHttpResponse response = httpClient.execute(httpGet);  int statusCode = response.getStatusLine().getStatusCode();  System.out.println("statusCode = " + statusCode);  HttpEntity entity = response.getEntity();  String body = EntityUtils.toString(entity);  System.out.println("body = " + body);  response.close();  httpClient.close();  
}

创建HttpClient对象
创建请求对象httpGet
通过httpClient.execute发送请求,接收响应结果
解析结果
关闭资源!

POST请求

@Test  public void testPOST() throws Exception {  CloseableHttpClient httpClient = HttpClients.createDefault();  HttpPost httpPost = new HttpPost("http://localhost:8080/admin/employee/login");  JSONObject jsonObject = new JSONObject();  jsonObject.put("username","admin");  jsonObject.put("password","123456");  StringEntity entity = new StringEntity(jsonObject.toString());  entity.setContentEncoding("utf-8");  entity.setContentType("application/json");  httpPost.setEntity(entity);  CloseableHttpResponse response = httpClient.execute(httpPost);  int statusCode = response.getStatusLine().getStatusCode();  System.out.println("statusCode = " + statusCode);  HttpEntity entity1 = response.getEntity();  String body = EntityUtils.toString(entity1);  System.out.println("body = " + body);  response.close();  httpClient.close();  }  
}

先创建JSON对象存储键值对形式的数据
然后将JSON对象转换为字符串,并创建一个StringEntity对象entity,并为其设置内容编码和内容类型,并将entity对象设置为httpPost请求的请求体
通过httpPost将这个对象发送出去

使用 JSONObject 再转换为 StringEntity 而非直接拼接 JSON 字符串,是因为JSON 对语法要求严格(例如引号必须是双引号、键必须用双引号包裹、特殊字符需转义等)。如果直接手动拼接字符串(例如 "{\"username\":\"admin\",\"password\":\"123456\"}"),虽然简单,但存在以下风险:

  • 容易出错:如果键值对较多、嵌套复杂,或值中包含特殊字符(如 "\、换行符等),手动拼接时容易遗漏转义,导致生成的 JSON 格式不合法。
  • 类型处理麻烦:如果值是数字、布尔值或其他对象(如日期),手动拼接需要额外处理类型转换(例如将 123 写成数字而非字符串),而 JSONObject 会自动根据值的类型生成正确的 JSON 表示(例如数字不加引号,布尔值为 true/false)。
    JSONObjectput 方法会自动处理这些问题,确保生成的字符串是符合 JSON 规范的格式。

微信小程序开发

使用微信开发者工具 Stable 1.06.2204250
在本地设置中选择 调试基础库3.5.8可正常运行小程序,使用太新的库可能出现白屏

微信登录流程

@PostMapping("/login")  
@ApiOperation("微信登录")  
public Result<UserLoginVO> login(@RequestBody UserLoginDTO userLoginDTO) {  User user = userService.wxLogin(userLoginDTO);  Map<String, Object> claims = new HashMap<>();  claims.put(JwtClaimsConstant.USER_ID, user.getId());  String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);  UserLoginVO userLoginVO = UserLoginVO.builder()  .id(user.getId())  .token(token)  .openid(user.getOpenid())  .build();  return Result.success(userLoginVO);  
}

String token = JwtUtil.createJWT(jwtProperties.getUserSecretKey(), jwtProperties.getUserTtl(), claims);
调用JwtUtil工具类的createJWT方法来创建一个 JWT。传入三个参数,第一个是jwtProperties.getUserSecretKey(),即从jwtProperties获取用于签名的用户密钥;第二个是jwtProperties.getUserTtl(),从jwtProperties获取该 JWT 的过期时间(TTL,Time To Live);第三个参数是前面构建好的claims,包含用户 ID 等声明信息。最后将创建好的 JWT 赋值给token变量。 整体来看,这段代码主要是在构建 JWT 相关的声明信息,并使用特定工具类创建一个包含用户 ID 且有过期时间设定的 JWT。 例如,假设JwtClaimsConstant.USER_ID的值为 “user_id”,user.getId()返回值为 12345,jwtProperties.getUserSecretKey()返回 “my_secret_key”,jwtProperties.getUserTtl()返回 3600(表示 1 小时过期),那么claims就会包含 {“user_id”: 12345},最终创建的 JWT 就是基于这个声明信息、密钥以及 1 小时过期时间生成的。

@Component  
@ConfigurationProperties(prefix = "sky.jwt")  
@Data  
public class JwtProperties {  /**  * 管理端员工生成jwt令牌相关配置  */  private String adminSecretKey;  private long adminTtl;  private String adminTokenName;  /**  * 用户端微信用户生成jwt令牌相关配置  */  private String userSecretKey;  private long userTtl;  private String userTokenName;  }
sky:  jwt:  # 设置jwt签名加密时使用的秘钥  admin-secret-key: itcast  # 设置jwt过期时间  admin-ttl: 7200000  # 设置前端传递过来的令牌名称  admin-token-name: token  user-secret-key: itheima  user-ttl: 7200000  user-token-name: authentication
属性名的自动映射规则

配置文件中的属性名(如 admin-secret-key)与 JwtProperties 类的字段名(如 adminSecretKey)遵循 “宽松绑定”(Relaxed Binding) 规则:

  • 配置文件中的属性名支持多种格式(如 kebab-casesnake_casecamelCaseUPPER_CASE),最终会映射到类的 camelCase 字段。
  • 具体映射规则:
    • 配置中的 -(kebab-case,如 admin-secret-key) → 类字段的 camelCase(如 adminSecretKey)。
    • 配置中的 _(snake_case,如 admin_secret_key) → 类字段的 camelCase(如 adminSecretKey)。
    • 配置中的全大写(如 ADMIN_SECRET_KEY) → 类字段的 camelCase(如 adminSecretKey)。

拦截器

    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//判断当前拦截到的是Controller的方法还是其他资源if (!(handler instanceof HandlerMethod)) {//当前拦截到的不是动态方法,直接放行return true;}//1、从请求头中获取令牌String token = request.getHeader(jwtProperties.getUserTokenName());//2、校验令牌try {log.info("jwt校验:{}", token);Claims claims = JwtUtil.parseJWT(jwtProperties.getUserSecretKey(), token);Long userId = Long.valueOf(claims.get(JwtClaimsConstant.USER_ID).toString());log.info("当前用户的id:", userId);BaseContext.setCurrentId(userId);//3、通过,放行return true;} catch (Exception ex) {//4、不通过,响应401状态码response.setStatus(401);return false;}}

使用JwtUtil用密钥解密token得到userId,将userId保存到本地
并在WebMvcConfiguration中注册user的拦截器

商品浏览功能

![[Pasted image 20250625144414.png]]

![[Pasted image 20250625144205.png]]

![[Pasted image 20250625144327.png]]

![[Pasted image 20250625144223.png]]

返回前端左侧的分类,点击一下前端会将category_id发送到后端请求,通过分类id查询菜品的功能实现显示右侧的菜品或套餐

service

/*** 条件查询菜品和口味* @param dish* @return*/public List<DishVO> listWithFlavor(Dish dish) {List<Dish> dishList = dishMapper.list(dish);List<DishVO> dishVOList = new ArrayList<>();for (Dish d : dishList) {DishVO dishVO = new DishVO();BeanUtils.copyProperties(d,dishVO);//根据菜品id查询对应的口味List<DishFlavor> flavors = dishFlavorMapper.getByDishId(d.getId());dishVO.setFlavors(flavors);dishVOList.add(dishVO);}return dishVOList;}

根据菜品查询出每一道菜的不同口味,其中口味通过dishFlavorMapper的getByDishId方法查询

总结

1.HttpClient

用于发送HTTP请求以及接收响应数据
主要用HttpGet和HttpPost

2.HttpClient流程

创建HttpClient对象
创建请求对象HttpGet(HttpPost)
通过httpClient.execute发送请求,并接受响应结果
解析结果
关闭资源

3.在使用Post请求时先创建JSON对象存储键值对形式的数据

JsonObject会自动根据值的类型生成正确的JSON表达式,使用put方法能够保证JSON规范,然后通过StringEntity(jsonObject.toString())将json转换为stirng类型的"json",设置编码和类型然后通过HttpClient.execute传输出去

4.微信登录流程:

前端发送用户的openid(每次都变)给后端,后端拿到后将小程序的appid的secret一起通过HttpClient发送给微信官方的服务器,官方服务器通过openid会返回这个用户的openid(不变的),然后在数据库查询是否为新用户,是的话创建一下,然后将token和id一起返回给前端,下次直接拿token和id给后端就好了

5.Jwt工具生成token的方式

通过JwtUtil工具类的createJWT方法创建,传入三个参数:
getUserSecretKey()从配置文件中获取用户密钥
getUserTtl()设置token过期时间
根据用户id等声明信息创建JWT复制给token

6.属性名的自动映射

配置文件中的属性名(如 admin-secret-key)与 JwtProperties 类的字段名(如 adminSecretKey)遵循 “宽松绑定”(Relaxed Binding) 规则:

  • 配置文件中的属性名支持多种格式(如 kebab-casesnake_casecamelCaseUPPER_CASE),最终会映射到类的 camelCase 字段。
  • 具体映射规则:
    • 配置中的 -(kebab-case,如 admin-secret-key) → 类字段的 camelCase(如 adminSecretKey)。
    • 配置中的 _(snake_case,如 admin_secret_key) → 类字段的 camelCase(如 adminSecretKey)。
    • 配置中的全大写(如 ADMIN_SECRET_KEY) → 类字段的 camelCase(如 adminSecretKey)。

7.商品浏览功能的逻辑

通过category/list请求返回侧边栏目的套餐项,当点击一个套餐时通过setmeal/list返回这个套餐下的所有菜品(套餐)
在查询菜品时点击一个有口味的菜品,会通过dish/list查询菜品的口味,然后合并到菜品信息中一起返回给前端

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

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

相关文章

React第六十三节Router中BrowserRouter的用途及注意事项

前言 BrowserRouter 是 React Router 库的核心组件&#xff0c;用于实现单页面应用&#xff08;SPA&#xff09;的客户端路由。它利用 HTML5 History API 管理 URL&#xff0c;实现页面无刷新跳转。下面详细解释其用途、使用方法和代码示例&#xff1a; 一、BrowserRouter 核…

《Self-Adapting Language Models》(SEAL)代码阅读笔记

代码&#xff1a;https://github.com/Continual-Intelligence 脚本命令用法&#xff1a;knowledge-incorporation/README.md 生成self-edit数据 脚本&#xff1a;sbatch knowledge-incorporation/scripts/make_squad_data.sh vllm serve启动Qwen2.5-7B模型的服务。 执行self-e…

GelSight Mini视触觉传感器开发资源升级:触觉3D点云+ROS2助力机器人科研与医疗等应用

近日&#xff0c;GelSight宣布对其GelSight Mini视触觉传感器的GitHub支持页面进行重大更新&#xff0c;围绕3D点云重建、ROS2 集成及开发者支持体系推出三大核心升级&#xff0c;助力机器人触觉感知、工业检测及科研场景落地。 GelSight Mini视触觉传感器重磅发布&#xff01;…

6、做中学 | 三年级下期 Golang值类型相互转换

本次为操作文章&#xff0c;大部分都在讨论类型之间如何转换&#xff0c;使用的是内置方法进行调用执行&#xff0c;详细使用请移步至&#xff1a; go的API使用文档地址 https://studygolang.com/pkgdoc 一、数值类型相互转换 go中数值转换需要显示转换&#xff0c;不能隐式自…

019 高校心理教育辅导系统技术解析:构建心理健康守护平台

高校心理教育辅导系统技术解析&#xff1a;构建心理健康守护平台 在关注大学生心理健康成为教育重点的当下&#xff0c;高校心理教育辅导系统借助数字化技术整合多种功能模块&#xff0c;面向管理员、学生、教师三类角色&#xff0c;实现心理教育辅导工作的高效化与精准化。本…

【ArcGIS】土地资源单项评价

【ArcGIS】土地资源单项评价 一、土地资源单项评价1、评价思路 二、操作步骤1、处理环境设置2、地形坡度评价3、高程评价4、坡度高程叠加评价5、地形起伏度6、土地资源综合评价 一、土地资源单项评价 1、评价思路 &#xff08;1&#xff09;利用全域DEM计算地形坡度&#xff…

Prioritized Generative Replay

ICLR 2025 Oral code 具有样本效率的 online reinforcement learning (RL) 通常使用 replay buffer 存储经验&#xff0c;以便在更新价值函数时重复使用。然而&#xff0c;uniform replay 效率低下&#xff0c;因为某些类型的 transition 可能与学习更相关。 虽然对更有用的样本…

Linux -- 线程、锁

1、 Linux线程概念 1.1、什么是线程 在一个程序里的一个执行路线就叫做线程&#xff08;thread&#xff09;更准确的定义是&#xff1a;线程是“一个进程内部的控制序列”一切进程至少都有一个执行线程线程在进程内部运行&#xff0c;本质是在进程地址空间内运行在Linux系统中…

海外服务器的定义和作用都有哪些?

海外服务器可以说是一个统称&#xff0c;其中包含了全球各地除了中国大陆以外其他国家的服务器&#xff0c;在如今的数字化时代中&#xff0c;海外服务器的应用已经成为跨国企业业务拓展、科研与学术交流等多个领域中不可或缺的一部分&#xff0c;能够为各个行业提供更加稳定且…

数据结构之优先级队列

系列文章目录 数据结构之ArrayList_arraylist o(1) o(n)-CSDN博客 数据结构之LinkedList-CSDN博客 数据结构之栈-CSDN博客 数据结构之队列-CSDN博客 数据结构之二叉树-CSDN博客 目录 系列文章目录 前言 一、优先级队列和堆 二、堆的模拟实现 1. 堆的创建 2. 计算建堆…

【版本控制教程】如何使用Unreal Engine 5 + UE源代码控制(Perforce P4)

本文来源perforce.com&#xff0c;由Perforce中国授权合作伙伴——龙智翻译整理&#xff0c;旨在为国内用户提供一份实用、易懂的Unreal Engine 5Perforce P4的中文使用指南。希望能为UE开发者、设计师和美术小伙伴们的版本控制实践提供有力支持~ Unreal Engine 5 是一款尖端的…

opensingleComDialog方法解析优化

下面是对 opensingleComDialog 方法的详细解析&#xff0c;并给出优化建议和优化后的代码。 方法解析 作用 opensingleComDialog(index) 方法用于在输入框失去焦点时&#xff08;blur 事件&#xff09;自动根据输入内容进行唯一性查询&#xff0c;如果查到唯一结果则自动填充…

css 实现1个像素在不同分辨率屏幕上画网格线

实现网格线绘制&#xff0c;要考虑画布style尺寸和画布像素大小的缩放关系 单像素绘制主要出现的问题是会模糊&#xff0c;从像素角度看就是出现绘制两个像素&#xff0c;实际就是要做偏移 核心就是&#xff1a;按物理像素绘制&#xff0c;首先要对齐物理像素&#xff0c;计算…

深度图聚类DGC—Paper Notes

目录 Unsupervised Deep Embedding for Clustering Analysis (DEC 2016)Attributed Graph Clustering: A Deep Attentional Embedding Approach (DAEGC 2019)Structural Deep Clustering Network (SDCN 2020)Contrastive Multi-View Representation Learning on Graphs (MVG…

获取YARN application 应用列表的几种方法

目录 1. 使用YARN命令行工具 2. 通过REST API获取 YARN 提供了获取YARN集群上运行的应用列表,以下是几种常见方法: 1. 使用YARN命令行工具 最直接的方式是使用YARN提供的命令行工具: yarn application -list 上述命令会显示所有正在运行的应用。 如果要查看所有应用(…

前端如何下载 ‘Content-Type‘: ‘application/octet-stream‘ 的文件

前言 在前端开发中&#xff0c;经常会遇到需要从后端接口下载文件的需求。当后端返回的响应头中 Content-Type 为 application/octet-stream 时&#xff0c;表示这是一个二进制流文件&#xff0c;浏览器无法直接展示&#xff0c;需要前端处理后下载到本地。本文将详细介绍前端…

咨询顾问进阶——顾问公司战略咨询分析模板【附全文阅读】

该战略咨询分析模板围绕企业战略分析展开&#xff0c;先从总体思考战略分析的目的与方法&#xff0c;接着探讨企业及战略定义、战略地位等。外部环境分析通过 PEST、五种竞争力等模型&#xff0c;分析环境、行业、市场等情况以发现机会与威胁&#xff1b;内部环境分析从资源、核…

宝塔服务器调优工具 1.1(Opcache优化)

第一步&#xff1a;宝塔服务器调优工具 1.1&#xff08;按照下面的参数填写&#xff09; 第二步&#xff1a;路径/www/server/php/80/etc/php.ini 搜索jit jit1235 其中1235根据服务器情况修改 第三步&#xff1a;路径/www/server/php/80/etc/php-cli.ini 搜索 jit1235 其中…

React Native【详解】动画

基础动画的实现流程 使用支持动画的组件 <Animated.Viewstyle{[{opacity: fadeAnim, // 绑定透明度动画值},]}><Text>动画元素</Text></Animated.View>Animated.View&#xff1a;用于创建动画容器&#xff0c;支持所有 View 的属性。Animated.Te…

如何轻松地将照片从 iPhone 传输到计算机

如果您的照片占据了 iPhone 上最多的存储空间&#xff0c;为什么不将照片从 iPhone 传输到电脑呢&#xff1f;您可能想要这样做&#xff0c;但不知道如何开始&#xff1f;如果是这样&#xff0c;那么本指南就是您所需要的。我们分享了 6 种方法以及步骤详细信息。您可以按照一种…