二刷 蒼穹外賣 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
英文地址,請注明出處:http://en.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 種方法以及步驟詳細信息。您可以按照一種…