Android開發中Retrofit使用方法與底層原理詳解

Retrofit 是 Android 開發中一個 類型安全、基于注解、高度解耦RESTful HTTP 客戶端庫,由 Square 公司開發。它極大地簡化了 Android 應用與 Web 服務進行網絡交互的過程。

核心價值:

  1. 聲明式 API 定義: 使用 Java/Kotlin 接口和注解描述 API 端點,將 HTTP 請求細節(方法、路徑、參數、頭、體)從業務邏輯中分離。
  2. 類型安全: 利用泛型和 Converter 機制,自動將 HTTP 響應體(如 JSON/XML)反序列化為強類型的對象(POJO/Kotlin Data Class),將請求體序列化。
  3. 高度可擴展: 通過 Converter.Factory 支持多種數據格式(Gson, Moshi, Jackson, Protobuf 等),通過 CallAdapter.Factory 支持多種異步執行機制(Call, RxJava Observable/Single, Kotlin Coroutines suspend, CompletableFuture 等)。
  4. 與 OkHttp 深度集成: Retrofit 底層默認使用強大的 OkHttp 作為 HTTP 客戶端,繼承其所有優點(連接池、GZIP 壓縮、緩存、攔截器等)。

一、使用流程 (Step-by-Step)

  1. 添加依賴:
    build.gradle (Module) 中添加必要的庫:

    dependencies {// Retrofit 核心庫implementation 'com.squareup.retrofit2:retrofit:2.9.0' // 使用最新穩定版// 選擇數據轉換器 (例如 Gson)implementation 'com.squareup.retrofit2:converter-gson:2.9.0'// 選擇異步適配器 (例如 Kotlin Coroutines, RxJava3)implementation 'com.squareup.retrofit2:adapter-rxjava3:2.9.0' // 或 'com.jakewharton.retrofit:retrofit2-kotlin-coroutines-adapter:0.9.2' (舊版適配器方式)// 或者直接使用 Retrofit 內置的協程支持(推薦,無需額外適配器)// Retrofit >=2.6.0 對 Kotlin 協程有原生支持 (suspend 函數)// OkHttp (通常需要)implementation 'com.squareup.okhttp3:okhttp:4.12.0'implementation 'com.squareup.okhttp3:logging-interceptor:4.12.0' // 可選,用于日志
    }
    
  2. 定義數據模型 (POJO/Data Class):
    創建表示 API 請求和響應數據的 Java/Kotlin 類。這些類字段應與 JSON/XML 的鍵名匹配,或使用注解(如 Gson 的 @SerializedName)指定映射關系。

    data class User(val id: Long, val name: String, val email: String)
    data class LoginRequest(val username: String, val password: String)
    data class ApiResponse<T>(val code: Int, val message: String, val data: T)
    
  3. 定義 API 接口:
    創建一個 Java/Kotlin 接口,使用 Retrofit 注解描述 API 端點。

    interface ApiService {// GET 請求示例:獲取用戶列表@GET("users")fun getUsers(): Call<List<User>>// GET 請求帶路徑參數:根據 ID 獲取用戶@GET("users/{id}")fun getUserById(@Path("id") userId: Long): Call<User>// GET 請求帶查詢參數:搜索用戶@GET("users/search")fun searchUsers(@Query("q") query: String): Call<List<User>>// POST 請求:登錄 (發送請求體 LoginRequest, 接收 ApiResponse<String>)@POST("auth/login")fun login(@Body loginRequest: LoginRequest): Call<ApiResponse<String>>// 使用 Kotlin 協程 (suspend 函數)@GET("users/{id}")suspend fun getUserByIdCoroutine(@Path("id") userId: Long): User// 使用 RxJava3@GET("users")fun getUsersRx(): Observable<List<User>>
    }
    

    關鍵注解:

    • @GET, @POST, @PUT, @DELETE, @PATCH, @HEAD, @OPTIONS, @HTTP: 定義 HTTP 請求方法。
    • @Path: 替換 URL 路徑中的占位符 ({id})。
    • @Query, @QueryMap: 添加 URL 查詢參數。
    • @Body: 將參數對象作為請求體發送(會被配置的 Converter 序列化)。
    • @Field, @FieldMap: 用于 application/x-www-form-urlencoded 表單提交。
    • @Part, @PartMap: 用于 multipart/form-data 文件上傳。
    • @Header, @Headers: 添加靜態或動態的 HTTP 請求頭。
    • @Url: 允許直接傳遞完整的 URL(覆蓋 baseUrl)。
  4. 創建 Retrofit 實例:
    使用 Retrofit.Builder() 構建一個配置好的 Retrofit 對象。這是單例的最佳實踐。

    object RetrofitClient {private const val BASE_URL = "https://api.example.com/"val instance: ApiService by lazy {// 創建 OkHttpClient (可配置攔截器、超時等)val okHttpClient = OkHttpClient.Builder().addInterceptor(HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY)) // 添加日志攔截器.connectTimeout(30, TimeUnit.SECONDS).readTimeout(30, TimeUnit.SECONDS).build()// 構建 Retrofit 實例Retrofit.Builder().baseUrl(BASE_URL) // 基礎 URL.client(okHttpClient) // 設置 OkHttpClient.addConverterFactory(GsonConverterFactory.create()) // 添加 Gson 轉換器//.addConverterFactory(MoshiConverterFactory.create()) // 或 Moshi// 根據需要添加 CallAdapter (協程 suspend 函數通常不需要額外適配器).addCallAdapterFactory(RxJava3CallAdapterFactory.create()) // 添加 RxJava3 適配器//.addCallAdapterFactory(CoroutineCallAdapterFactory()) // 舊版協程適配器 (Retrofit <2.6.0).build().create(ApiService::class.java) // 創建 API 接口的實現}
    }
    
  5. 發起網絡請求:

    • 傳統 Call 方式:
      val call = RetrofitClient.instance.getUsers()
      call.enqueue(object : Callback<List<User>> {override fun onResponse(call: Call<List<User>>, response: Response<List<User>>) {if (response.isSuccessful) {val users = response.body() // 獲取反序列化后的對象// 更新 UI (需切回主線程)} else {// 處理 HTTP 錯誤 (如 404, 500)val errorBody = response.errorBody()?.string()}}override fun onFailure(call: Call<List<User>>, t: Throwable) {// 處理網絡錯誤 (如 IO 異常, 連接超時)}
      })
      // call.cancel() // 可以取消請求
      
    • Kotlin 協程方式 (suspend):
      viewModelScope.launch(Dispatchers.IO) { // 在 ViewModel 或協程作用域中try {val user = RetrofitClient.instance.getUserByIdCoroutine(1) // 直接調用 suspend 函數withContext(Dispatchers.Main) {// 更新 UI (在主線程)}} catch (e: Exception) {// 處理異常 (包括網絡錯誤和 HTTP 錯誤)e.printStackTrace()}
      }
      
    • RxJava 方式:
      RetrofitClient.instance.getUsersRx().subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe({ users ->// 更新 UI (在主線程)}, { throwable ->// 處理錯誤})
      

二、應用場景

  1. 獲取 RESTful API 數據: 最常見的場景,從服務器獲取列表數據(用戶、商品、新聞)、詳情數據等。
  2. 提交表單數據: 用戶登錄/注冊、提交評論、填寫調查問卷等。
  3. 文件上傳: 使用 @Multipart@Part 上傳圖片、視頻、文檔等。@Part 類型可以是 MultipartBody.PartRequestBody
  4. 文件下載: 通過 Retrofit 獲取 ResponseBody 流,然后寫入文件。
  5. 身份驗證:
    • 基本認證: 通過 @Header("Authorization") 添加 Basic 頭。
    • Token 認證 (Bearer): 使用 @Header("Authorization") 添加 Bearer token。Token 管理通常結合 OkHttp Interceptor 自動添加。
    • OAuth: 同樣可以通過攔截器處理復雜的 OAuth 流程。
  6. 請求重試與緩存策略: 利用 OkHttp 的 Interceptor 實現自定義重試邏輯和緩存控制。
  7. API 聚合/組合: 結合 RxJava 的 flatMap/zip 或 Kotlin 協程的 async/await,并行或順序調用多個 API 并組合結果。
  8. Mock 測試: 利用 Retrofit 的 MockWebServer 或通過自定義 CallAdapter/Converter 進行單元測試,模擬網絡響應。

三、實現原理深度剖析

Retrofit 的設計非常精妙,其核心在于 動態代理、注解解析、責任鏈模式強大的可擴展性

  1. 動態代理 (Proxy):

    • 當你調用 retrofit.create(ApiService::class.java) 時,Retrofit 使用 Java 的 Proxy.newProxyInstance() 動態創建了一個 ApiService 接口的實現類對象
    • 這個動態生成的代理對象,攔截了你對接口中定義的任何方法的調用。
    • 當調用代理對象的某個方法(如 getUserById(1))時,代理邏輯會捕獲這次調用,獲取方法對象 (Method)、方法參數 (args[]) 和注解信息。
  2. 注解解析與 ServiceMethod 構建:

    • 代理邏輯的核心是 ServiceMethod(或其子類 HttpServiceMethod)。
    • 對于每個接口方法,Retrofit 在第一次調用時(或通過緩存)會解析該方法上的所有注解(@GET, @Path, @Query 等)和方法參數。
    • 解析過程 (RequestFactory 或類似機制):
      • 確定 HTTP 方法(GET/POST 等)。
      • 解析相對 URL 和路徑參數占位符。
      • 收集查詢參數、表單字段、請求頭、請求體等信息。
      • 確定參數如何綁定(路徑替換、查詢字符串、請求體等)。
    • 最終構建出一個 “請求模板” (RequestFactory)。這個模板知道如何根據具體的參數值構造出一個符合該 API 要求的 HTTP 請求。它本身還不是一個 okhttp3.Request 對象,但包含了構建它所需的所有規則和參數綁定信息。
  3. 請求構造 (okhttp3.Request):

    • 當實際調用發生時(例如 getUserById(1)),代理邏輯會:
      • 獲取之前為該方法構建好的 ServiceMethod(包含 RequestFactory)。
      • 將傳入的實際參數值(如 1)應用到 RequestFactory 上。
      • RequestFactory 根據參數值替換路徑 ({id} -> 1),添加查詢參數,構造請求頭,序列化請求體(通過配置的 Converter)。
      • 最終生成一個具體的 okhttp3.Request 對象。
  4. Call 的創建與適配 (CallAdapter):

    • ServiceMethod 使用配置的 CallAdapter.Factory 列表來查找合適的 CallAdapter
    • CallAdapter 負責將底層 OkHttp 的 Call 對象適配成接口方法聲明的返回類型。例如:
      • 如果方法返回 Call,則直接返回一個包裝了 okhttp3.Call 的 Retrofit Call 對象。
      • 如果方法返回 RxJava 的 ObservableRxJava3CallAdapter 會創建一個 Observable,它在被訂閱時發起網絡請求,并通過 onNext/onError 發射結果或錯誤。
      • 如果方法是 Kotlin suspend 函數(Retrofit >=2.6.0),內置的 SuspendCallAdapter 會處理它。它本質上創建一個 Call,但在協程內部使用 suspendCancellableCoroutine 掛起協程,在 enqueue 的回調中恢復協程并返回結果或拋出異常。
  5. 發起請求與響應處理:

    • 最終生成的 Call 對象(無論是原始的 Retrofit Call,還是被適配器包裝過的 Call 行為)底層都委托給一個 okhttp3.Call 對象。
    • 調用 call.enqueue() (異步) 或 call.execute() (同步) 會觸發 OkHttp 執行實際的網絡請求。
    • OkHttp 處理 DNS 解析、建立連接、發送請求、接收響應、處理重定向/重試、緩存等。
    • 當響應返回時:
      • OkHttp 得到一個 okhttp3.Response
      • Retrofit 首先檢查 HTTP 狀態碼(200-299 視為成功)。
      • 如果成功: 使用配置的 Converter(如 GsonConverterFactory)將 Response.body() 的原始字節流反序列化為接口方法聲明的返回類型(如 User 對象)。這個反序列化后的對象通過回調(Callback.onResponse)或作為 suspend 函數的返回值,或通過 RxJava 的 onNext 傳遞給上層。
      • 如果不成功: 嘗試使用 Converter 解析 Response.errorBody()(如果 API 有錯誤體的約定),或者直接傳遞錯誤狀態碼和錯誤體字符串。錯誤通過 Callback.onFailure (對于網絡錯誤或調用取消),或在 onResponse 中通過非成功狀態碼體現,或作為 suspend 函數拋出的異常,或通過 RxJava 的 onError 傳遞。
  6. 責任鏈模式 (OkHttp Interceptors):

    • Retrofit 本身不直接處理網絡 IO,它完全依賴 OkHttp。
    • OkHttp 的核心是其強大的 攔截器 (Interceptor) 鏈。你可以添加自定義攔截器或使用內置攔截器(如日志攔截器 HttpLoggingInterceptor、重試攔截器、認證攔截器、緩存攔截器等)。
    • 請求 (Request) 會依次經過所有攔截器鏈(Application Interceptors -> RetryAndFollowUpInterceptor -> BridgeInterceptor -> CacheInterceptor -> ConnectInterceptor -> Network Interceptors -> CallServerInterceptor),每個攔截器都可以修改請求或提前返回響應。
    • 響應 (Response) 會逆著攔截器鏈返回,每個攔截器都可以修改響應或處理錯誤。
  7. 可擴展性 (Converter.Factory, CallAdapter.Factory):

    • Converter.Factory: 負責在 Java/Kotlin 對象和 HTTP 表示(請求體字節流 / 響應體字節流)之間進行轉換。工廠模式允許根據類型(如方法的返回類型 Call)和注解動態選擇具體的 Converter(如 GsonResponseBodyConverter)。
    • CallAdapter.Factory: 負責將底層 Call 對象適配成不同的異步執行模型(Call, Observable, Single, CompletableFuture, suspend 函數等)。工廠模式允許根據方法的返回類型(如 Observable)動態選擇具體的 CallAdapter(如 RxJava3CallAdapter)。

總結流程圖簡化:

[ 開發者調用 ApiService.getUserById(1) ]|v
[ 動態代理攔截調用 ]| (獲取 Method, 參數 args)v
[ ServiceMethod (緩存/解析) ]| (解析注解和參數類型,構建 RequestFactory)v
[ 應用參數值到 RequestFactory -> 構造 okhttp3.Request ]|v
[ CallAdapter.adapt(okhttp3.Call) -> 適配為返回類型 (e.g., Call<User>, Observable<User>, suspend fun) ]|v
[ 開發者使用適配后的對象發起請求 (e.g., call.enqueue(), subscribe(), 調用 suspend fun) ]|v
[ 底層 okhttp3.Call 執行,經過 OkHttp Interceptor 鏈 ]|v
[ 收到 okhttp3.Response ]|v
[ Retrofit 檢查狀態碼 ]|--> [ 成功: Converter 反序列化 body -> 通過適配器傳遞結果 ]|--> [ 失敗: 處理 errorBody 或錯誤 -> 通過適配器傳遞錯誤 ]

四、關鍵設計哲學與注意事項

  1. 約定優于配置: 通過接口和注解清晰定義 API 契約。
  2. 分層設計: Retrofit 專注于 API 定義、請求構建、響應轉換和適配,將底層網絡傳輸委托給 OkHttp,將數據轉換委托給 Converter,將異步模型委托給 CallAdapter。
  3. 不可變性: Retrofit 實例、ServiceMethodCall(一旦創建)通常是不可變的,利于并發和安全。
  4. 性能: ServiceMethod 的解析和構建通常會被緩存,避免每次調用都進行反射和解析注解的開銷。
  5. 錯誤處理: 必須妥善處理網絡錯誤(onFailure/異常)和 HTTP 業務錯誤(非 2xx 狀態碼,response.isSuccessful)。不要忽略 errorBody()
  6. 線程切換: Retrofit 默認在后臺線程執行網絡請求。務必在主線程更新 UI。協程作用域(viewModelScope/lifecycleScope)和 RxJava 的 observeOn(AndroidSchedulers.mainThread())Callback 中的手動切換 (runOnUiThread/Handler/LiveData.postValue) 是常見做法。
  7. 生命周期管理: 取消不再需要的網絡請求(尤其是在 Activity/Fragment 銷毀時),避免內存泄漏和無效回調。ViewModelviewModelScopeRxJavaDisposable 可以很好地管理。
  8. Converter 選擇: 根據 API 數據格式(JSON/XML/Protobuf)和性能需求選擇合適的轉換器(Gson, Moshi, Jackson, protobuf-converter)。Moshi 通常比 Gson 更快更輕量。
  9. 動態 URL/Header: 使用 @Url 參數或 Interceptor 處理動態變化的 Base URL 或需要動態添加的 Header(如 Token)。
  10. 測試: 利用 MockWebServer 模擬網絡響應進行單元測試。也可以 Mock ApiService 接口進行更上層的測試。

結論:
Retrofit 通過其優雅的設計、強大的注解系統、靈活的擴展機制(Converter/CallAdapter)以及與 OkHttp 的無縫集成,成為了 Android 網絡請求的事實標準。理解其使用流程、適用場景,特別是深入掌握其基于動態代理、注解解析和責任鏈模式的實現原理,對于高效、健壯地進行 Android 網絡編程至關重要。它顯著提升了開發效率,降低了網絡層的復雜性,并保證了類型安全和代碼的可維護性。

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

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

相關文章

基于FPGA的IIC控制EEPROM讀寫(2)

基于FPGA的IIC控制EEPROM讀寫 文章目錄基于FPGA的IIC控制EEPROM讀寫一、EEPROM簡介二、代碼實現——個人理解1、狀態機2、仿真效果3、上板驗證4、代碼top.viic_master.vuart三、代碼實現——復用性較高的IIC模塊1、框架設計2、狀態機設計3、仿真效果4、上板驗證5、代碼top.viic…

C# 界面程序在23H2型號系統中無法退出

20250716記錄 環境&#xff1a;c# winform問題描述&#xff1a;主界面退出直接使用了Environment.Exit(0); 程序假死&#xff0c;無法關閉解決措施&#xff1a;//使用 this.Close();以下代碼目標&#xff1a;執行完程序自身后&#xff0c;刪除指定文件&#xff08;可用于程序文…

Kafka——集群核心參數配置

引言在分布式系統中&#xff0c;Kafka 憑借其高吞吐量、低延遲和強大的擴展性&#xff0c;成為數據管道和流處理的首選解決方案。然而&#xff0c;要充分發揮 Kafka 的性能和穩定性&#xff0c;正確配置集群參數至關重要。為什么參數配置如此重要&#xff1f;Kafka 的參數配置直…

單臂路由實現VLAN互通實驗

實驗拓撲圖實驗需求&#xff1a;按照圖示為 PC3 和 PC4 配置 IP 地址和網關PC3 屬于 Vlan10&#xff0c;PC4 屬于 Vlan20&#xff0c;配置單臂路由實現 Vlan10 和 Vlan20 三層互通PC3 和 PC4 可以互通實驗步驟&#xff1a;1.PC 配置 IP 地址2.PC3 屬于 Vlan10&#xff0c;PC4 屬…

基于漸進式遷移學習網絡(PTLN)?的小樣本故障診斷模型

目錄 一、研究背景與挑戰? ?二、創新方法:漸進式遷移學習網絡(PTLN)?? ?1. 核心架構?編輯 ?2. 訓練優化? 三、核心代碼 四、實驗結果與優勢? ?1. 數據集? ?2. 性能對比? ?3. 關鍵驗證? 五、工程價值與未來方向? 六、補充信息? 一、研究背景與挑…

網絡原理 —— HTTP

通過網絡初識&#xff0c;我們認識了網絡的協議棧&#xff0c;TCP/IP 分為五層&#xff1a;應用層&#xff0c;傳輸層&#xff0c;網絡層&#xff0c;數據鏈路層&#xff0c;物理層。也介紹了其中的關鍵協議。而這些協議的理解&#xff0c;是我們寫網絡代碼的基礎。 應用層&…

docker--安裝--原理

安裝 鏈接 啟動之后&#xff0c;docker狀態查看&#xff1a; sudo systemctl status docker 添加普通用戶到docker用戶組&#xff1a; sudo usermod -aG docker $USER# 重啟或者使用以下命令刷新組權限&#xff1a;newgrp docker 原理

Java并發第一篇(從零開始:一文讀懂Java并發編程核心基礎)

從零開始&#xff1a;一文讀懂Java并發編程核心基礎一. 為什么需要并發編程&#xff1f;二. 并發編程的“另一面”&#xff1a;挑戰與代價2.1 頻繁的上下文切換2.2 線程安全問題&#xff08;如&#xff1a;死鎖&#xff09;三. 夯實基礎&#xff1a;必須掌握的核心概念與操作3.…

【刪庫跑路】一次刪除pip的所有第三方庫

進入命令行&#xff0c;先list看下庫存pip list導出所有的第三方庫至一文件列表pip freeze >requirements.txt按照列表卸載所有庫pip uninstall -r requirements.txt -y再list看下&#xff0c;可見庫存已清空

python 【技術面試題和HR面試題】?列表操作、條件判斷、循環、函數定義編程題

1.技術面試題 &#xff08;1&#xff09;解釋Linux中的進程、線程和守護進程的概念&#xff0c;以及如何管理它們&#xff1f; 答&#xff1a; 進程 概念&#xff1a;程序運行的實例&#xff0c;有獨立資源&#xff08;如內存&#xff09;&#xff0c;是系統調度的基本單位。 管…

Debian 12中利用dpkg命令安裝MariaDB 11.8.2

MariaDB 11.8解決了2038問題&#xff0c;即在32位系統中將timestamp從2038-01-19 03:14:07 UTC擴展到2106-02-07 06:28:15 UTC&#xff0c;向后延長了68年。由于寫此文時Debian 12的源中還沒有MariaDB 11.8,采用源碼編譯又太費時&#xff0c;可用二進制碼或dpkg安裝 .下面簡要記…

Go語言高并發聊天室(三):性能優化與壓力測試

Go語言高并發聊天室&#xff08;三&#xff09;&#xff1a;性能優化與壓力測試 &#x1f3af; 本篇目標 在前兩篇文章中&#xff0c;我們完成了聊天室的基礎功能。本篇將深入性能優化&#xff0c;實現真正的高并發&#xff1a; &#x1f50d; 性能瓶頸分析? 關鍵優化技術&…

【leetcode】852. 山脈數組的封頂索引

文章目錄題目題解1. 遍歷2. 二分查找題目 852. 山脈數組的封頂索引 給定一個長度為 n 的整數 山脈 數組 arr &#xff0c;其中的值遞增到一個 峰值元素 然后遞減。 返回峰值元素的下標。 你必須設計并實現時間復雜度為 O(log(n)) 的解決方案。 示例 1&#xff1a; 輸入&a…

Java期末考試準備

文章目錄Java期末考試準備一、Java的輸入.next()輸入.nextLine()輸入區別補充二、Java的輸出三、類中常寫方法toString()equals()其他四、容器/數組五、繼承六、靜態屬性、方法.七、抽象類八、接口九、初始化模塊十、泛型考完結束語Java學習歷程注:這篇文章本來是寫給同學的&am…

飛算JavaAI進階:重塑Java開發范式的AI革命

引言&#xff1a;當代碼生成進入"自動駕駛"時代 在2025年的Java開發領域&#xff0c;一場由AI驅動的革命正在重塑傳統開發范式。當GitHub Copilot還在通過代碼補全提升效率時&#xff0c;飛算JavaAI已實現從需求分析到完整工程代碼生成的"端到端"閉環。這款…

如何在銀河麒麟桌面系統中啟用 sudo 密碼的星號反饋

引文 我們在銀河麒麟桌面操作系統上使用 sudo 命令時&#xff0c;都遇到過這樣的困擾&#xff1a;輸入密碼時光標一動不動&#xff0c;屏幕上沒有任何提示&#xff08;沒有星號 *&#xff0c;也沒有任何字符&#xff09;&#xff1f;就像在黑暗中摸索鑰匙孔一樣&#xff0c;心里…

二刷 黑馬點評 秒殺優化

優化邏輯 把耗時較短的邏輯判斷放入redsi中&#xff0c;比如庫存是否足夠以及是否一人一單&#xff0c;只要這樣的邏輯完成&#xff0c;就代表一定能下單成功&#xff0c;我們就將結果返回給用戶&#xff0c;然后我們再開一個線程慢慢執行隊列中的信息 問題&#xff1a; 如何快…

HANA SQLScript中的變量類型匯總

在 SAP HANA SQLScript 中&#xff0c;可以使用多種變量類型&#xff0c;包括標量&#xff08;Scalar&#xff09;類型、表類型和結構化類型。以下是各種變量類型的詳細說明和示例。1. 標量變量&#xff08;Scalar Variables&#xff09; 標量變量是用于存儲單個值&#xff08;…

基于 Amazon Nova Sonic 和 MCP 構建語音交互 Agent

1、引言 隨著人工智能技術的飛速發展&#xff0c;自然語言處理和語音交互技術正在深刻改變人機交互的方式。語音交互正從簡單的“機械應答”向更自然的“類人對話”演進 。傳統的語音系統通常采用模塊化架構&#xff0c;將語音處理流程割裂為 ASR&#xff08;自動語音識別&…

項目的存量接口怎么低成本接入MCP?

項目的存量接口怎么低成本接入MCP&#xff1f; 老項目里的一些接口&#xff0c;如何低成本的接入MCP&#xff08;0成本不可能&#xff09;&#xff0c;變成MCP server 的tools&#xff1f; 先拋出這個問題&#xff1f;評論區的xdm如果有懂的&#xff0c;可以打在評論區&#xf…