【微服務】SpringBoot 自定義消息轉換器使用詳解

目錄

一、前言

二、SpringBoot 內容協商介紹

2.1 什么是內容協商

2.2 內容協商機制深入理解

2.2.1 內容協商產生的場景

2.3 內容協商實現的常用方式

2.3.1 前置準備

2.3.2?通過HTTP請求頭

2.3.2.1 操作示例

2.3.3 通過請求參數

三、SpringBoot 消息轉換器介紹

3.1 HttpMessageConvertor介紹

3.1.1 常用的HttpMessageConvertor

3.2 如何確定使用哪個消息轉換器

3.2.1 針對請求時的判斷

3.2.2 針對響應時的判斷

3.3 SpringMVC框架默認的消息轉換器

3.3.1 源碼跟蹤

四、自定義消息轉換器

4.1 自定義yaml消息轉換器

4.1.1 引入如下的依賴

4.1.2 自定義yaml媒體類型

4.1.3 自定義HttpMessageConverter

4.1.4 配置消息轉換器

4.1.5 測試與效果驗證

五、寫在文末


一、前言

在微服務開發中,客戶端與服務端數據格式的協商和轉換是一個經常接觸的場景,不同的業務場景下,對于數據格式的要求也不同,比如有的客戶端需要服務器響應XML格式數據,有的需要響應Json格式數據,這就是HTTP消息內容協商機制的源頭,如何滿足復雜多變的HTTP消息轉換需求呢,本篇將詳細分享如何在SpringBoot框架中完成自定義消息轉換器的定制開發與使用。

二、SpringBoot 內容協商介紹

2.1 什么是內容協商

內容協商(Content Negotiation)是指服務器根據客戶端請求來決定響應的內容類型(MIME 類型)。這使得應用程序可以根據客戶端的需求返回不同格式的數據,如 JSON、XML 或 HTML 等。Spring Boot 通過 HttpMessageConverters 和 @RequestMapping 注解等機制來支持內容協商。

2.2 內容協商機制深入理解

內容協商機制是指服務器根據客戶端的請求來決定返回資源的最佳表現形式

  • 白話描述:客戶端需要什么格式的數據,服務端就返回什么格式的數據。

比如:

  • 客戶端需要json,就響應json;

  • 客戶端需要xml,就響應xml;

  • 客戶端需要yaml,就響應yaml;

于是,你可能會有疑問,客戶端接收數據時統一采用一種格式,例如Json不就行了,為什么還有那么多的格式要求呢?因為在實際開發中并不是這樣的,比如在下面的場景:

  • 遺留的老的系統中的某些業務,處理數據時仍然使用的是xml格式;

  • 對于處理速度有要求的這種系統,明確要求使用json格式的數據;

  • 對于安全要求比較高的系統,一般要求使用xml格式的數據;

  • 某些業務場景下明確指定了某個類型的數據格式...

基于上面的場景,在當下流行的微服務開發模式下,不同的客戶端可能需要后端返回不同格式的數據,于是,對于后端來說,就需要盡可能的適配和滿足這種多樣化的需求場景。

2.2.1 內容協商產生的場景

內容協商的產生具有一定的背景,下面列舉了產生內容協商的一些因素

  • 多客戶端支持

    • 瀏覽器用戶可能希望看到 HTML 頁面。

    • 移動應用開發者可能更傾向于使用 JSON 數據來解析和展示信息。

    • 某些舊系統或特定工具可能依賴于 XML 格式的響應。

  • 提升用戶體驗

    • 不同的客戶端有不同的偏好和要求。允許客戶端指定他們想要的內容類型可以提高交互效率,減少不必要的數據處理步驟,并確保最終呈現給用戶的界面是最優化的。例如,某些設備可能更適合處理壓縮過的二進制格式,而不是文本格式的數據。

  • 遵照RESTful?原則

    • 遵循 REST 架構風格的應用程序通常會根據資源的狀態來確定響應的內容類型,而不是依賴于 URL 的變化。這意味著同一個 URI 可以根據請求的不同部分(如 HTTP 方法、查詢參數或頭部信息)返回不同類型的內容。內容協商是實現這一設計理念的關鍵機制之一。

2.3 內容協商實現的常用方式

通常來說,通過HTTP請求頭(比如Accept)獲取請求參數(如Format),來指定客戶端偏好接收的內容類型(JSON或XML等),服務器會根據這些信息選擇合適的格式進行響應。下面介紹2種比較常用的方式。

2.3.1 前置準備

為了后續的操作演示,請提前在工程中導入下面幾個基礎依賴

<properties><maven.compiler.source>17</maven.compiler.source><maven.compiler.target>17</maven.compiler.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>3.2.4</version><relativePath/></parent><dependencies><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId></dependency><dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency></dependencies></project>

2.3.2?通過HTTP請求頭

SpringBoot框架中,如果開發人員不做任何配置的情況下,優先使用這種方式。

  • 服務器會根據客戶端發送請求時提交在請求頭中的信息,比如:”Accept:application/json“或"Accept:text/html"來決定最終響應什么格式數據;

2.3.2.1 操作示例

添加一個接口

@RestController
public class UserController {//localhost:8081/getUser@GetMapping("/getUser")public Object getUser(){return new User("mike",18);}}

正常調用,請求頭不加任何參數默認得到的是json結構

如果在請求頭指定響應的數據格式,如下,在Accept中指定是json

curl -H "Accept: application/json" localhost:8081/getUser

如果此時我們指定返回xml格式的數據,此時發現并不好使

curl -H "Accept: application/xml" localhost:8081/getUser

如果需要支持該怎么辦呢?需要做下面的2步:

1)添加依賴jackson-dataformat-xml

  • 可以將Java對象轉為xml格式的數據

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>

2)為實體類增加注解

在當前的User類上面添加注解 @JacksonXmlRootElement用于轉換為xml

package com.congge.entity;import com.fasterxml.jackson.dataformat.xml.annotation.JacksonXmlRootElement;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;@JacksonXmlRootElement
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {private String name;private int age;}

3)請求測試調用

指定為json

指定為xml

總結:

  • 客戶端請求的時候,通過在請求協議的請求頭上面增加一個Accept字段,服務端接收到這個值之后,會根據這個參數值動態返回客戶端要求的格式的數據;

2.3.3 通過請求參數

也可以在請求url中拼接指定的請求參數的方式實現,默認的請求參數名為format,格式如下:

http://xxx?format=json

仍然以上面的接口為例,測試一下這種方式的使用

curl http://localhost:8081/getUser?format=json

效果如下:

但是如果指定format為xml,發現并不生效

原因是springboot中在內容協商的處理上,優先使用Accept這種方式,所以如果你要使用format這種方式,還需在配置文件中增加下面的配置信息;

#使用format的方式完成內容協商,如果沒有配置,默認采用Accept的方式實現
spring:mvc:contentnegotiation:favor-parameter: true#默認就叫format,也可以改為自定義的名稱parameter-name: format

設置完成后再次重啟服務測試,此時可以看到兩種格式的數據都支持

三、SpringBoot 消息轉換器介紹

在上面通過案例操作演示介紹了什么是spring框架的內容協商機制,簡單來說就是,客戶端需要什么樣格式的數據,服務端就響應什么格式數據,事實上真的就那么簡單嗎?這背后框架做了什么呢?是不是有什么組件在這個轉換的過程中起作用了呢?接下來就要詳細介紹springmvc框架中對于內容協商的重要技術組件,即HttpMessageConvertor。

3.1 HttpMessageConvertor介紹

HttpMessageConvertor是一個接口,被翻譯為HTTP消息轉換器,即對HTTP消息進行轉換,什么是HTTP消息呢?HTTP消息本質上就是瀏覽器向服務端發送請求時提交的數據,或者是服務器向瀏覽器響應的數據。而HttpMessageConvertor接口就是負責完成請求/響應時數據格式轉換用的。

  • 在springmvc框架中提供了很多種HttpMessageConvertor接口的實現類,不同的HTTP消息轉換器具有不同的轉換效果,使用的場景也有區別,有的是負責將Java對象轉為JSON格式的數據,有的負責將Java對象轉為XML格式的數據。

3.1.1 常用的HttpMessageConvertor

springmvc框架內置了一些常用的消息轉換器,正是這些轉換器完成了諸如上述json或xml格式的數據轉換,下面介紹一些常用的框架內置的消息轉換器:

  • FormHttpMessageConvertor

    • 常用于處理提交表單數據時候使用的轉換器;

  • MappingJackson2HttpMessageConvertor

    • 客戶端或瀏覽器提交JSON格式的數據轉換為JAVA對象主要是由這個轉換器處理,比如經常在POST請求接口上面添加的@RequestBody注解;

  • JaxbRootElementHttpMessageConvertor

    • 將JAVA對象轉為XML格式的數據通常由這個消息轉換器完成;

  • StringHttpMessageConvertor

    • 將String類型的的數據直接寫入到響應中由這個轉換器完成;

3.2 如何確定使用哪個消息轉換器

有這么多的消息轉換器,那么在具體使用的時候,框架是如何確定使用哪種類型的轉換器的呢?

3.2.1 針對請求時的判斷

請求時通常根據下面的條件來確定使用哪個消息轉換器:

  • 請求的Content-Type頭信息

    • SpringMVC會檢查Content-Type頭信息,以確定請求體的數據格式,比如:application/json,application/xml...

  • 方法參數類型

    • 控制器方法中接收請求體的參數類型,比如POST請求中有@RequestBody注解;

3.2.2 針對響應時的判斷

響應時通常根據以下條件來確定使用哪個消息轉換器:

  • 請求提交時,請求頭上的Accept字段

    • Spring MVC 會檢查客戶端請求的 Accept 字段,以確定客戶端期望的響應格式(例如 application/json、application/xml 等);

  • 方法返回值的類型

    • 控制器方法的返回值類型比如: @ResponseBody

      • @ResponseBody + 控制器方法的返回值是String,則使用StringHttpMessageConverter轉換器。(將字符串直接寫入響應體)

      • @ResponseBody + 控制器方法的返回值是Java對象,則使用MappingJackson2HttpMessageConverter轉換器。(將java對象轉換成json格式的字符串寫入到響應體)

3.3 SpringMVC框架默認的消息轉換器

SpringMVC框架自身已經內置了一些消息轉換器,可以在啟動的時候debug源碼看到,主要包括下面6個

  • ByteArrayHttpMessageConverter

    • 用于將字節數組(byte[])與HTTP消息體之間進行轉換。這通常用于處理二進制數據,如圖片或文件。

  • StringHttpMessageConverter

    • 用于將字符串(String)與HTTP消息體之間進行轉換。它支持多種字符集編碼,能夠處理純文本內容。

  • ResourceHttpMessageConverter

    • 用于將Spring的Resource對象與HTTP消息體之間進行轉換。Resource是Spring中表示資源的接口,可以讀取文件等資源。這個轉換器對于下載文件或發送靜態資源有用。

  • ResourceRegionHttpMessageConverter

    • 用于處理資源的部分內容(即“Range”請求),特別是當客戶端請求大文件的一部分時。這對于實現視頻流媒體等功能很有用。

  • AllEncompassingFormHttpMessageConverter

    • 用于處理表單,是一個比較全面的form消息轉換器。處理標準的application/x-www-form-urlencoded格式的數據,以及包含文件上傳的multipart/form-data格式的數據。

  • MappingJackson2HttpMessageConverter

    • 使用Jackson庫來序列化和反序列化JSON數據。可以將Java對象轉換為JSON格式的字符串,反之亦然。

3.3.1 源碼跟蹤

入口類:WebMvcAutoConfiguration

  • WebMvcAutoConfiguration內部類EnableWebMvcConfiguration

  • EnableWebMvcConfiguration繼承了DelegatingWebMvcConfiguration

  • DelegatingWebMvcConfiguration繼承了WebMvcConfigurationSupport

DelegatingWebMvcConfiguration

繼續進入到WebMvcConfigurationSupport

在這個類中,提供了一個方法 addDefaultHttpMessageConverters,在這個方法中,會將工程中的所有的消息轉換器加進去。下面通過debug源碼的方式跟進一下過程。

啟動springboot工程后,進入該方法,此時messageConverters這個列表還是空的

從源碼不難看出,方法中會new出幾個內置的轉換器加入到這個集合中

在上面的方法中,注意到會有一個判斷的方法,比如:jackson2XmlPresent,它是如何判斷的呢?其實在當前的類中,在靜態代碼塊中維護了一個全局的布爾變量,工程在加載的時候,通過ClassUtils.isPresent方法,傳入類的全路徑,從而判斷是否滿足條件,滿足,則在addDefaultHttpMessageConverters方法執行時候加入進去。

最后在這個方法執行完成的時候,列表中就添加了一些消息轉換器

通過debug源碼不難看出,在實際開發中,只要引入相關的依賴,讓類路徑存在某個類,則對應的消息轉換器就會被加載。

四、自定義消息轉換器

實際項目開發過程中,來自客戶端的需求場景是很多的,當系統內置的轉換器格式不能滿足要求時,比如需要返回yaml格式的數據,或者其他定制化類型的數據時,此時就可以考慮自定義消息轉換器。下面以yaml這種特殊格式的數據為例進行說明。

4.1 自定義yaml消息轉換器

下面看具體的操作步驟。

4.1.1 引入如下的依賴

任何一個能夠處理yaml格式數據的庫都可以,這里選擇使用jackson的庫,因為它既可以處理json,xml,又可以處理yaml。

<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId>
</dependency>

通過下面這段程序測試一下這個SDK的轉換效果


import com.congge.entity.User;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;public class JavaYamlTest {public static void main(String[] args) throws JsonProcessingException {// 創建YAML工廠類YAMLFactory yamlFactory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER); // 禁止使用文檔頭標記// 創建對象映射器ObjectMapper objectMapper = new ObjectMapper(yamlFactory);// 準備數據User user = new User("user01", 12);// 將數據轉換成YAML格式String res = objectMapper.writeValueAsString(user);System.out.println(res);}}

運行可以看到能夠正常轉換

4.1.2 自定義yaml媒體類型

Springboot 默認支持xml和json兩種媒體類型,如果要支持yaml格式的,需新增一個yaml媒體類型,在springboot的配置文件中進行如下配置:

spring:mvc:contentnegotiation:media-types:yaml: text/yaml

注意:

  • 以上types后面的yaml是媒體類型的名字,名字可以自己修改,如果媒體類型起名為xyz,那么發送請求時的路徑應該是這樣的:http://localhost:8081/getUser?format=xyz

4.1.3 自定義HttpMessageConverter

編寫一個類,比如:YamlHttpMessageConverter繼承AbstractHttpMessageConverter,需要繼承AbstractHttpMessageConverter這個類,參考下面的代碼:

package com.congge.config;import com.congge.entity.User;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import org.springframework.http.HttpInputMessage;
import org.springframework.http.HttpOutputMessage;
import org.springframework.http.MediaType;
import org.springframework.http.converter.AbstractHttpMessageConverter;
import org.springframework.http.converter.HttpMessageNotReadableException;
import org.springframework.http.converter.HttpMessageNotWritableException;import java.io.IOException;
import java.nio.charset.Charset;public class YamlHttpMessageConverter extends AbstractHttpMessageConverter<Object> {private ObjectMapper objectMapper = new ObjectMapper(new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER));/*** 將自定義的消息轉換器 和 配置文件中自定義的媒體類型 text/yaml 進行綁定*/public YamlHttpMessageConverter() {super(new MediaType("text", "yaml", Charset.forName("UTF-8")));}/*** 用于指定消息轉換器支持哪些類型的對象轉換,比如這里指定User對象類型的數據進行轉換* @param clazz* @return*/@Overrideprotected boolean supports(Class<?> clazz) {// 表示User類型的數據支持yaml,其他類型不支持return User.class.isAssignableFrom(clazz);}/*** 處理 @RequestBody(將提交的yaml格式數據轉換為java對象)* @param clazz* @param inputMessage* @return* @throws IOException* @throws HttpMessageNotReadableException*/@Overrideprotected Object readInternal(Class<?> clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null;}/*** 處理 @ResponseBody(將java對象轉換為yaml格式的數據)* @param o* @param outputMessage* @throws IOException* @throws HttpMessageNotWritableException*/@Overrideprotected void writeInternal(Object o, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {this.objectMapper.writeValue(outputMessage.getBody(), o);// 注意:spring框架會自動關閉輸出流,無需程序員手動釋放。}
}

補充說明:

  • 所有的消息轉換器,包括自定義的,都需要實現HttpMessageConverter接口,或者繼承AbstractHttpMessageConverter這個類,重寫里面的核心方法。

4.1.4 配置消息轉換器

重寫WebMvcConfigurer接口的configureMessageConverters方法,將上面的自定義消息加入到全局的轉換器列表中。

package com.congge.config;import org.springframework.context.annotation.Configuration;
import org.springframework.http.converter.HttpMessageConverter;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import java.util.List;@Configuration
public class ConverterWebConfig implements WebMvcConfigurer {@Overridepublic void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new YamlHttpMessageConverter());}}

4.1.5 測試與效果驗證

啟動工程,通過下面的curl命令再次測試,可以看到通過上面的自定義改造已經能夠輸出yaml格式的數據了

curl -H "Accept: text/yaml" localhost:8081/getUser

針對其他類型格式的轉換器,也可以參照上面的步驟進行編寫即可

五、寫在文末

本文詳細介紹了SpringBoot消息轉換器的知識,并通過案例操作演示了如何進行自定義消息轉換器的定制開發和使用,希望對看到的同學有用哦,本篇到此結束,感謝觀看。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64389.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64389.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64389.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

深入理解Composer自動加載機制

Composer是PHP生態系統中最常用的依賴管理工具之一&#xff0c;它不僅能夠幫助開發者管理項目的依賴關系&#xff0c;還能夠自動加載這些依賴項。自動加載機制是Composer的核心功能之一&#xff0c;通過自動加載&#xff0c;開發者可以在運行時按需加載所需的類和文件&#xff…

【游戲設計原理】35 - 委員會設計

一、 分析并總結 核心內容 定義&#xff1a;委員會設計&#xff08;Design by Committee&#xff09;是指游戲開發團隊通過集體協作完成設計&#xff0c;這種模式結合了多樣化的創意和個體專長&#xff0c;但也可能因缺乏一致性而導致設計的混亂。優勢&#xff1a;多樣性帶來…

【Java】IO流練習

IO流練習 題干&#xff1a; 根據指定要求&#xff0c;完成電話記錄、 注冊、登錄 注冊 題干&#xff1a; 完成【注冊】功能&#xff1a; 要求&#xff1a; 用戶輸入用戶名、密碼存入users.txt文件中 若users.txt文件不存在&#xff0c;創建該文件若users.txt文件存在 輸入…

內網學習:工作組用戶與權限

目錄 一、本地用戶組介紹本地工作組介紹用戶與組的關系 二、四種用戶類型及權限比較本地系統最高權限&#xff08;System賬戶&#xff09;特性Administrator與System賬戶的區別 本地最高管理員&#xff08;Administrator用戶&#xff09;特性 本地普通管理員特性 本地普通用戶特…

SpringMVC核心、兩種視圖解析方法、過濾器攔截器 “ / “ 的意義

SpringMVC的執行流程 1. Spring MVC 的視圖解析機制 Spring MVC 的核心職責之一是將數據綁定到視圖并呈現給用戶。它通過 視圖解析器&#xff08;View Resolver&#xff09; 來將邏輯視圖名稱解析為具體的視圖文件&#xff08;如 HTML、JSP&#xff09;。 核心流程 Controlle…

抽象類和接口的區別是什么?

抽象類和接口在編程中都是用來定義對象的公共行為的重要概念&#xff0c;但兩者之間存在顯著的區別。以下是對抽象類和接口的詳細比較&#xff1a; 一、定義與關鍵字 抽象類&#xff1a;使用abstract關鍵字定義&#xff0c;表示該類是抽象的&#xff0c;不能被實例化。抽象類…

html+css+js網頁設計 美食 美拾9個頁面

htmlcssjs網頁設計 美食 美拾9個頁面 網頁作品代碼簡單&#xff0c;可使用任意HTML輯軟件&#xff08;如&#xff1a;Dreamweaver、HBuilder、Vscode 、Sublime 、Webstorm、Text 、Notepad 等任意html編輯軟件進行運行及修改編輯等操作&#xff09;。 獲取源碼 1&#xff0…

Linux下PostgreSQL-12.0安裝部署詳細步驟

一、安裝環境 postgresql-12.0 CentOS-7.6 注意&#xff1a;確認linux系統可以正常連接網絡&#xff0c;因為在后面需要添加依賴包。 二、pg數據庫安裝包下載 下載地址&#xff1a;PostgreSQL: File Browser 選擇要安裝的版本進行下載&#xff1a; 三、安裝依賴包 在要安…

『VUE』vue-quill-editor設置內容不可編輯(詳細圖文注釋)

目錄 預覽思路調用代碼借助Props添加isDisable屬性控制 是否內容可編輯總結 歡迎關注 『VUE』 專欄&#xff0c;持續更新中 歡迎關注 『VUE』 專欄&#xff0c;持續更新中 預覽 思路 禁用焦點事件和內容改變事件 調用代碼 <quillEditorclass"editor":class"…

python 和go 語法對比

Python 和 Go 是兩種設計哲學和應用場景有所不同的編程語言&#xff0c;它們在語法、類型系統、并發模型等方面存在顯著差異。以下是 Python 和 Go 語法特點的詳細對比&#xff1a; 語法簡潔性與結構 Python 的語法以其簡潔易讀而著稱。它使用縮進來表示代碼塊的層次結構&…

我們來學activiti -- bpmn

bpmn 題記bpmn結余 題記 在《Activiti很難學》提到學習知識點需要面對的思想鋼印問題 按常見步驟&#xff0c;先展示下官方的客套話 BPMN&#xff08;Business Process Model and Notation&#xff09;是一種業務流程建模符號&#xff0c; 它是一種圖形化的語言&#xff0c;用…

【MuJoCo和PhysX】

MuJoCo 與 Unity 的 PhysX 引擎的主要區別 應用領域&#xff1a; MuJoCo&#xff1a;主要用于機器人學、強化學習、生物力學等領域&#xff0c;擅長處理多自由度、復雜動力學問題&#xff0c;尤其適合進行高精度的物理仿真。 Unity PhysX&#xff1a;主要用于游戲開發、虛擬現…

LeetCode:257. 二叉樹的所有路徑

跟著carl學算法&#xff0c;本系列博客僅做個人記錄&#xff0c;建議大家都去看carl本人的博客&#xff0c;寫的真的很好的&#xff01; 代碼隨想錄 LeetCode&#xff1a;257. 二叉樹的所有路徑 給你一個二叉樹的根節點 root &#xff0c;按 任意順序 &#xff0c;返回所有從根…

十二月第五周python

第一個程序&#xff0c;熟悉轉換器&#xff0c;把加法計算器變成exe# // 1,制作加法計算器&#xff0c; # 輸入兩個數字得到相加結果并輸出aint(input("輸入數字&#xff1a;"))#int()是把輸入的內容轉換成整數&#xff0c; bint(input("輸入數字&#xff1a;&…

FFmpeg 的常用API

FFmpeg 的常用API 附錄&#xff1a;FFmpeg庫介紹 庫介紹libavcodec音視頻編解碼核心庫編碼 (avcodec_send_frame, avcodec_receive_packet)。解碼 (avcodec_send_packet, avcodec_receive_frame)。libavformat提供了音視頻流的解析和封裝功能&#xff0c;多種多媒體封裝格式&…

關于最新MySQL9.0.1版本zip自配(通用)版下載、安裝、環境配置

一、下載 從MySQL官網進行下載MySQL最新版本&#xff0c;滑到頁面最下面點擊社區免費版&#xff0c;&#xff08;不是企業版&#xff09; 點擊完成后選擇自己想要下載的版本&#xff0c;選擇下載zip壓縮&#xff0c;不用debug和其他的東西。 下載完成后進入解壓&#xff0c;注…

vulnhub靶場 Empire LupinOne

使用命令查看靶機ip,訪問ip arp-scan -l 使用御劍掃描一下子域名&#xff0c;但是沒有獲取到什么有用的信息 這是一個Apache文檔&#xff0c;沒有什么用 緊接著我們嘗試暴力破解&#xff0c;這里推薦使用ffuf工具暴力破解目錄&#xff0c;kali自帶的ffuf掃描速度賊快 參數解釋…

Kubernetes# Helm工具使用

目錄 概念 核心組件 Helm客戶端 Tiller Chart Repository Release Helm安裝 Helm使用 創建Helm Chart 定義Chart元數據 定義Template模板 定義values參數 打包和部署 Helm Chart 推送到遠程倉庫 Helm常用命令 概念 Helm 是一個 Kubernetes 的包管理工具&#…

Mirror網絡框架-從入門到精通之Mirror簡介

前言 在現代游戲開發中&#xff0c;網絡功能日益成為提升游戲體驗的關鍵組成部分。Mirror是一個用于Unity的開源網絡框架&#xff0c;專為多人游戲開發設計。它使得開發者能夠輕松實現網絡連接、數據同步和游戲狀態管理。本文將深入介紹Mirror的基本概念、如何與其他網絡框架進…

Yocto 項目中的交叉編譯:原理與實例

Yocto 項目是一個強大的工具集&#xff0c;它專注于為嵌入式系統生成定制的 Linux 發行版。交叉編譯在 Yocto 項目中扮演著核心角色&#xff0c;它使得開發者能夠在功能強大的宿主機上構建適用于資源受限目標設備的軟件系統。這篇文章將從運行原理、實際案例和工具鏈組成等角度…