【接口自動化】-1- 初識接口

一、什么是接口

接口涉及到四個實體:(我去飯店點餐)

我是客人 :客戶端

廚師:服務器

服務員:接口

菜單:接口文檔

接口定義了一套信息規則讓兩個系統之間互相不必知道對方的內部,只需通過接口就能進行交互

API應用編程接口:各個應用(程序之間進行高效的溝通與協作)?

?

二、HTTP接口

基于HTTP協議的接口

基本特點

  • 交互簡單:請求 -> 響應模式,無狀態
  • 結構簡單:請求、響應,都是:行、頭、體
  • 內容簡單:除了體,其他均為 ASCII 內容
  • 應用廣泛:至于體,支持 JSON、HTML、XML、HTML、圖片、視頻、音樂
  • 跨平臺兼容性:電腦、電視、手機、智能家居

有冒號的是頭 頭完了兩個換行是體?

?請求
行:方法(GET POST等)
頭:描述(修飾)體
體:無限可能

響應
行:狀態碼
頭:描述(修飾)體

緩存:CacheControl, Last-Modified

內容:Content-Type,Content-Length

體:無限可能

三、 接口測試工具實操

fiddler 的測試步驟:
1. 配置代理,使 Fiddler 錄制請求
2. 點擊 Replay and Edit,修改參數:構造的測試用例
3. 點擊 Run、Start,發送修改后的請求,得到新的響應

優勢:

  • 基于真實的請求,有連貫業務場景
  • 進行底層的精細化的操作
  • 配套的相關請求,由客戶端完成,降低使用門檻

高顏值的 半自動化的接口測試工具:postman

完全自動化就是自己寫python代碼啦?

四、自動化測試的流程 

  1. 分析文檔(理解需求)
    • 核心功能
      • 登錄:
        • 方法:post
        • url:?http://api.fbi.com:9225/rest-v2/login/access_token
        • body:
          • email
          • password
      • 創建任務:
        • 方法:post
        • url:?http://api.fbi.com:9225/rest-v2/todo
        • body:
          • title(選填)
          • is_done(選填)
      • 查詢任務列表
        • 方法:get
        • url:?http://api.fbi.com:9225/rest-v2/todo
        • 參數:
          • page(選填)
          • size(選填)
      • 刪除任務:
        • 方法:delete
        • url:?http://api.fbi.com:9225/rest-v2/todo/{todo_id}
        • 參數:
          • todo_id
    • 次要功能
    • 輔助功能
    • 理解:
      • 有些接口有安全性要求:需要先登錄再使用
      • 任務 id:需要動態獲取(接口關聯)

2. 設計用例

  1. 用例標題:驗證登錄賬號可刪除任務
  2. 前置條件:
    1. 已登錄(得到了身份信息)
    2. 有任務(已經創建待刪除的任務)
  3. 測試步驟:
    1. 得到任務 ID
    2. 調用刪除接口(結果 1)
    3. 調用查詢接口(結果 2)
  4. 斷言(驗證結果):
    1. 結果 1 成功
    2. 結果 2 失敗
3. 數據準備
可登錄的賬號(bf@qq.com;bf123456
可測試的任務

數據驅動測試的數據?件

4. 編寫腳本
  • 1. 純代碼腳本
  • 2. 框架的?例

5. 執?步驟

6. 斷?結果

五、接口客戶端 requests


HTTP 協議客戶端事實上的標準:

  • 不支持異步
  • 不支持 HTTP2
pip install requests pytest jsonptah -i https://mirrors.aliyun.com/pypi/simple/
import requestsresp = requests.get("http://www.baidu.com")print(resp.status_code)

requests.request 參數


表單

import requests# 1. 登錄
resp = requests.request(method='post',url="http://api.fbi.com:9225/rest-v2/login/access_token",data={"email": "bf@qq.com","password": "bf123456"}
)print(resp.status_code)  # 人工判斷
if resp.status_code == 200:  # 自動判斷print('成功')
else:print('失敗')

?

json

import requests# 1. 登錄
resp = requests.request(method='post',url="http://api.fbi.com:9225/rest-v2/login/access_token",json={"email": "bf@qq.com","password": "bf123456"}
)print(resp.status_code)  # 人工判斷if resp.status_code == 200:  # 自動判斷print('成功')
else:print('失敗')

?文件

import requests# 1. 登錄
resp = requests.request(method='post',url="http://api.fbi.com:9225/rest-v2/login/access_token",files={"email": open("詳細信息顯示.mp4", "rb"),"password": open("惺惺惜惺惺.mp4", "rb"),}
)print(resp.status_code)  # 人工判斷
if resp.status_code == 200:  # 自動判斷print('成功')
else:print('失敗')

requests.Response屬性


狀態碼


響應頭

resp = requests.request(method='get',url="http://www.baidu.com",
)print("行:", resp.status_code, resp.reason)
print("頭:", resp.headers, )
print("頭:", dict(resp.cookies), )

響應體

print(resp.content)  # 二進制:傳輸
print(resp.text)     # 文本:閱讀
print(resp.json())   # 字典:使用  可能失敗
print(resp.json()['token_type'])

?

requests.Session概念

cookies /session

(有多個請求構成的)同一個對話過程

共享參數
請求頭(身份憑據)

共享網絡
HTTP 協議基于 TCP,握手、揮手
最大端口 65535,其中 1024 保留

共享 cookies

🌰 示例場景:模擬用戶登錄知乎

假設我們使用requests.Session模擬用戶登錄知乎,并在登錄后訪問個人主頁:

  1. 第一次請求:訪問登錄頁面(獲取初始 Cookies)
  2. 第二次請求:提交登錄表單(服務器驗證并設置身份 Cookies)
  3. 第三次請求:訪問個人主頁(自動攜帶登錄態 Cookies)

?

🚀 代碼演示與解析

import requests# 創建Session對象(核心:自動管理Cookies)
session = requests.Session()# 1. 第一次請求:訪問登錄頁面(獲取初始Cookies)
response1 = session.get('https://www.zhihu.com/signin')
print(f"第一次請求后Session中的Cookies: {session.cookies.get_dict()}")
# 輸出示例: {'_zap': 'xxx', 'd_c0': 'yyy'}

第一次請求詳細過程

  • 客戶端發送請求:GET https://www.zhihu.com/signin(無 Cookies)
  • 服務器響應:
    • 返回登錄頁面 HTML
    • 設置初始 Cookies(如_zap=xxx; d_c0=yyy
  • Session自動捕獲并存儲這些 Cookies
    • 此時session.cookies包含:{'_zap': 'xxx', 'd_c0': 'yyy'}
# 2. 第二次請求:提交登錄表單(攜帶初始Cookies,獲取身份Cookies)
response2 = session.post(url='https://www.zhihu.com/api/v3/oauth/sign_in',json={'username': 'test@example.com', 'password': '123456'}
)
print(f"第二次請求后Session中的Cookies: {session.cookies.get_dict()}")
# 輸出示例: {'_zap': 'xxx', 'd_c0': 'yyy', 'z_c0': 'token123'}

第二次請求詳細過程

  • 客戶端發送請求:
    • 請求頭自動攜帶第一次獲取的 Cookies:Cookie: _zap=xxx; d_c0=yyy
    • 請求體:{"username": "test@example.com", "password": "123456"}
  • 服務器響應:
    • 驗證登錄信息
    • 設置身份 Cookies(如z_c0=token123,表示用戶已登錄)
  • Session更新 Cookies:
    • 合并新 Cookies:{'_zap': 'xxx', 'd_c0': 'yyy', 'z_c0': 'token123'}

# 3. 第三次請求:訪問個人主頁(自動攜帶所有Cookies)
response3 = session.get('https://www.zhihu.com/settings/profile')
print(f"第三次請求后Session中的Cookies: {session.cookies.get_dict()}")
# 輸出示例: {'_zap': 'xxx', 'd_c0': 'yyy', 'z_c0': 'token123'}

第三次請求詳細過程

  • 客戶端發送請求:
    • 請求頭自動攜帶所有 Cookies:Cookie: _zap=xxx; d_c0=yyy; z_c0=token123
  • 服務器響應:
    • 驗證z_c0身份令牌
    • 返回個人主頁內容(只有登錄用戶可見)

?

📊 三次請求對比表

請求步驟請求 URL請求攜帶的 Cookies服務器返回的 Cookies最終 Session 中 Cookies
第一次/signin_zap=xxx; d_c0=yyy{'_zap': 'xxx', 'd_c0': 'yyy'}
第二次/api/v3/oauth/sign_in_zap=xxx; d_c0=yyyz_c0=token123{'_zap': 'xxx', 'd_c0': 'yyy', 'z_c0': 'token123'}
第三次/settings/profile_zap=xxx; d_c0=yyy; z_c0=token123無(或更新已有 Cookies){'_zap': 'xxx', 'd_c0': 'yyy', 'z_c0': 'token123'}

?

🔑 關鍵結論

  1. Cookies 自動傳遞Session會自動在后續請求中攜帶之前獲取的所有 Cookies,無需手動干預。
  2. Cookies 自動合并:如果服務器返回新的 Cookies(如登錄后的身份令牌),Session會自動合并(覆蓋同名 Cookies,保留不同名的)。
  3. 會話一致性:整個過程模擬了真實瀏覽器的行為,確保多個請求屬于同一個用戶會話。

?

🛠? 調試技巧

如果你想查看每次請求的詳細信息(包括請求頭、響應頭等),可以添加以下代碼:

# 打印請求信息(包含Cookies)
print(f"請求URL: {response1.request.url}")
print(f"請求頭: {response1.request.headers}")
print(f"響應狀態碼: {response1.status_code}")
print(f"響應頭: {response1.headers}")

六、關聯請求?


接口關聯:使用另一個接口的響應內容,作為下一個接口的請求參數

  1. 大部分接口都需要:共享參數
  2. 個別接口才需要:全局變量

其他的提取方式:re、jsonpath

jsonpath 用法:

  • 針對字典
  • 使用 jsonpath 語法
  • 返回列表

import jsonpathtoken = jsonpath.jsonpath(resp.json(), "$.access_token")[0]s.headers.update({"Authorization": f"bearer {token}"})

?

jsonpath?講解 🧐

jsonpath?是用于從 JSON 數據(Python 中常表現為字典、列表嵌套結構 )里提取特定內容的工具,類似字符串處理里的正則表達式,但專為 JSON 結構設計,在接口關聯(從接口響應提取數據給下一個接口用)場景超實用,核心要點如下:

?

1. 基礎作用 🎯

從復雜 JSON 結構里,按路徑規則精準提取值。比如接口返回如下 JSON 數據(登錄接口返回帶?access_token?):

{  "code": 200,  "data": {  "access_token": "abc123",  "expires_in": 3600  },  "msg": "success"  
}  

想提取?access_token,就可以用?jsonpath?按路徑?$.data.access_token?快速拿到。

?

2. 語法規則(常用) 📖
語法符號含義示例 & 效果
$根節點(整個 JSON 數據的入口)$.data?→ 提取?data?字典內容:{"access_token": "abc123", "expires_in": 3600}
.取子節點、對象屬性$.data.access_token?→ 提取?access_token?值:abc123
[]取列表元素、過濾對象(索引 / 條件)- 列表取值:$.data.users[0](假設?users?是列表,取第 1 個元素)
- 過濾:$.data.users[?(@.age>18)](取?users?里?age?大于 18 的對象)

?

3. 在代碼里的使用步驟(結合接口關聯場景) 💻

以登錄后拿?token?給后續接口用為例:

import requests  
import jsonpath  # 1. 發送登錄接口請求,拿到響應  
login_url = "http://api.example.com/login"  
login_data = {"username": "test", "password": "123"}  
resp = requests.post(login_url, json=login_data)  # 2. 用 jsonpath 提取 access_token(假設響應是 JSON 格式)  
# resp.json() 把響應轉成 Python 字典/列表,jsonpath 按規則提取  
token_list = jsonpath.jsonpath(resp.json(), "$.data.access_token")  
# jsonpath 返回列表,提取第 1 個元素(實際場景需判斷列表非空)  
token = token_list[0] if token_list else None  # 3. 把 token 放到請求頭,給后續接口用(比如帶 Authorization)  
s = requests.Session()  
s.headers.update({"Authorization": f"bearer {token}"})  # 4. 后續接口請求自動帶 token(實現接口關聯)  
user_info_url = "http://api.example.com/userinfo"  
user_resp = s.get(user_info_url)  

?

4. 常見場景 & 優勢 🌟
  • 接口關聯必備:登錄接口返回的?token、創建訂單返回的?order_id?等,用?jsonpath?能輕松提取,傳給下一個接口當參數。
  • 處理復雜結構:如果 JSON 嵌套很深(比如多層字典、列表混合),用?.?逐層找屬性,比 Python 手動寫循環 / 字典取值簡潔太多。
  • 兼容性:不管是?requests?響應轉的字典,還是普通 JSON 格式字符串轉的字典,都能處理,只要結構符合 JSON 規范。

?

5. 注意事項 ??
  • jsonpath.jsonpath()?返回列表,如果沒找到匹配內容,返回?False?而不是空列表!所以實際用的時候,建議判斷一下:
  • result = jsonpath.jsonpath(data, "$.xxx")  
    if result:  value = result[0]  
    else:  # 處理提取失敗邏輯,比如拋異常、設默認值  raise ValueError("提取 xxx 失敗")  
    

  • 語法別和 Python 字典取值搞混,jsonpath?用?$.data.access_token?,Python 原生是?data["access_token"]?,但?jsonpath?更適合復雜結構遍歷。

簡單說,jsonpath?就是為 JSON 提取而生的 “導航儀”,按路徑找數據超方便,接口自動化里處理響應、做關聯請求必學~ 結合代碼多試幾個嵌套結構,就能快速掌握啦 ?

?

?七、完整的自動化實戰?

import requests
import jsonpath# 0. 創建會話,共享參數和網絡鏈接
s = requests.Session()
test_user = "bf@qq.com"
test_pass = "bf123456"# 1. 登錄
resp = s.request(method='post',url="http://api.fbi.com:9225/rest-v2/login/access_token",json={"email": test_user,"password": test_pass}
)if resp.status_code == 200:  # 自動判斷print('登錄成功')
else:print('登錄失敗')# 共享參數(身份憑據)
token = jsonpath.jsonpath(resp.json(), "$.access_token")[0]
s.headers.update({"Authorization": f"bearer {token}"})# 2. 查詢任務列表
resp = s.request("get","http://api.fbi.com:9225/rest-v2/todo",
)if resp.status_code == 200:print('查詢任務列表成功')total = resp.json()['total']print(f"當前任務總數: {total}")# 3. 創建任務
resp = s.request("post","http://api.fbi.com:9225/rest-v2/todo",json={"title": "新的任務", "is_done": False}
)if resp.status_code == 200:print('創建任務成功')# 提取變量,以便關聯new_id = jsonpath.jsonpath(resp.json(), "$.id")[0]print(f"新創建的任務ID: {new_id}")# 4. 再次查詢任務列表
resp = s.request("get","http://api.fbi.com:9225/rest-v2/todo",
)if resp.status_code == 200:print('再次查詢任務列表成功')new_total = resp.json()['total']print(f"當前任務總數: {new_total}")if new_total == total + 1:print('任務創建驗證成功')# 5. 刪除任務
resp = s.request("delete",f"http://api.fbi.com:9225/rest-v2/todo/{new_id}",
)if resp.status_code == 200:print('刪除任務成功')# 6. 再次查詢任務列表
resp = s.request("get","http://api.fbi.com:9225/rest-v2/todo",
)if resp.status_code == 200:print('最后一次查詢任務列表成功')renew_total = resp.json()['total']print(f"當前任務總數: {renew_total}")if renew_total == new_total - 1:print('任務刪除驗證成功')if renew_total == total:print('任務總數恢復驗證成功')

?

在 API 認證中,Bearer?是一種常見的身份驗證方案,用于在 HTTP 請求中傳遞令牌(Token),表明請求者的身份。它是 OAuth 2.0 協議的一部分,也是現代 API 最常用的認證方式之一。

?

📜?Bearer Token 的基本概念

Bearer?本質是一個授權類型(Authorization Type),告訴服務器:“我持有這個令牌,請驗證我的身份”。它的格式通常是:

Authorization: Bearer <token>

  • Bearer:固定關鍵字,表示使用令牌認證。
  • <token>:服務器頒發的唯一身份令牌(如 JWT、Access Token)。

?

🔐?為什么需要 Bearer?

在傳統的認證方式(如 Basic Auth)中,用戶憑證(用戶名 + 密碼)會直接暴露在請求中,存在安全風險。而?Bearer Token?允許用戶通過無狀態、一次性的令牌訪問受保護資源,避免了直接傳遞敏感信息。

常見場景

  • 用戶登錄后,服務器返回一個 Token(如 JWT)。
  • 客戶端在后續請求中攜帶這個 Token,無需再次登錄。
  • 服務器驗證 Token 有效性,確認請求者身份。

?

🚀?代碼中的 Bearer 實現

Bearer?用于傳遞登錄后獲取的?access_token

# 登錄后提取Token
token = jsonpath.jsonpath(resp.json(), "$.access_token")[0]# 將Token添加到請求頭,格式為 "Bearer <token>"
s.headers.update({"Authorization": f"bearer {token}"})

  • 注意大小寫:標準寫法是?Bearer(首字母大寫),但有些服務器可能不區分大小寫。

?

🔒?安全注意事項

  1. Token 泄露風險:Bearer Token 相當于 “數字鑰匙”,一旦泄露,攻擊者可冒充用戶訪問系統。因此:

    • 永遠不要在 URL、日志或客戶端代碼中明文存儲 Token。
    • 優先使用 HTTPS 確保傳輸安全。
    • 為 Token 設置合理的過期時間(如 2 小時)。
  2. 防止 CSRF 攻擊:Bearer Token 通常用于 API 請求,需配合同源策略(Same-Origin Policy)或 CSRF 令牌保護。

?

🤔?Bearer vs. 其他認證方式

認證方式優點缺點適用場景
Bearer Token無狀態、易于擴展、支持跨域Token 泄露風險高REST API、前后端分離
Basic Auth簡單、標準明文傳輸密碼,安全性低內部系統、臨時訪問
OAuth 2.0第三方授權、細粒度權限控制實現復雜開放平臺(如微信登錄)

?

🌟?總結

Bearer?是一種通過令牌進行身份驗證的機制,在現代 API 中廣泛使用。它的核心是將服務器頒發的 Token 放在請求頭中,格式為?Authorization: Bearer <token>,從而實現安全、無狀態的身份驗證。

?

total = resp.json()['total']?是從 API 響應中提取數據的關鍵步驟!我來拆解一下它的含義和作用~ 🧐

?

1.?代碼拆解:分步解釋

①?resp.json()
  • resp?是?requests?發送請求后得到的響應對象。
  • resp.json()?是將響應內容(通常是 JSON 格式的字符串)解析為?Python 字典或列表
    例如,如果響應是?{"code": 200, "total": 10},則?resp.json()?返回?{'code': 200, 'total': 10}
②?['total']
  • 從解析后的字典中,通過鍵(Key)'total'?提取對應的值。
    例如,上面的例子中?resp.json()['total']?就是?10

?

2.?結合場景理解

這行代碼出現在?查詢任務列表?的步驟中:

# 查詢任務列表
resp = s.request("get", "http://api.fbi.com:9225/rest-v2/todo")
if resp.status_code == 200:total = resp.json()['total']  # 提取任務總數

假設 API 返回的 JSON 是這樣的:

{"code": 200,"message": "success","data": {"items": [{"id": 1, "title": "任務1"},{"id": 2, "title": "任務2"}],"total": 2  # 這是任務總數}
}

?

那么?resp.json()['total']?就會提取出?2,表示當前有 2 個任務。

?

3.?為什么需要這個值?

在自動化測試中,這個值通常用于?驗證業務邏輯

  • 比如創建新任務后,檢查總數是否增加 1。
  • 刪除任務后,檢查總數是否減少 1。
# 創建任務前的總數
total = resp.json()['total']  # 創建任務...# 創建后的總數
new_total = resp.json()['total']  # 驗證總數是否增加1
if new_total == total + 1:print('任務創建驗證成功')

4.?潛在風險與優化

①?Key 不存在的情況

如果 API 返回的 JSON 中沒有?total?鍵,直接訪問會報錯。
優化建議:使用?.get()?方法,不存在時返回默認值(如?None)。

total = resp.json().get('total')  # 不存在時返回None
if total is not None:# 處理邏輯
else:print("響應中缺少'total'字段")

②?響應格式變化

如果 API 升級后返回格式變了(如?total?移到?data.total),代碼會失效。
優化建議:使用?jsonpath?更靈活地提取數據(已經在用啦!)。

total = jsonpath.jsonpath(resp.json(), '$.total')[0]  # 更健壯的寫法

🌟?總結

這行代碼的核心作用是:從 API 響應中提取?任務總數,用于后續的業務邏輯驗證(如創建 / 刪除任務后檢查數量變化)。它是接口自動化測試中?數據斷言?的關鍵步驟!

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

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

相關文章

華為FTTR光貓V173 F30改公開版界面 附帶真正的s161補全一體固件

【本文介紹】 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ 這款FTTR的V173 F30看著顏值很高 也很實用 畢竟是XGPON萬兆的光貓…

【學習】數字化車間與智能工廠如何推進制造業轉型

在制造業轉型升級的浪潮中&#xff0c;數字化車間與智能工廠已成為推動產業變革的核心引擎。前者通過物聯網、大數據與自動化技術的深度融合&#xff0c;實現生產流程的精細化管控與資源優化&#xff1b;后者則依托人工智能、5G通信與數字孿生技術&#xff0c;構建起具備自感知…

HTML元素與高級功能完全教程:從基礎到精通

目錄 章節1:HTML的靈魂——元素的本質與結構化思維 1.1 元素的核心:標簽、屬性與內容 1.2 語義化的革命 1.3 常見的“坑”與避坑指南 章節2:表單元素:打造交互的基石 2.1 表單基礎:與核心控件 2.2 高級輸入類型與驗證 2.3 表單的可訪問性與用戶體驗 章節3:HTML5多媒…

IP證書:構建數字世界知識產權安全防線的基石

引言 在數字化浪潮席卷全球的今天&#xff0c;知識產權&#xff08;IP&#xff09;的保護已成為企業、機構乃至個人面臨的重要挑戰。無論是商業秘密、專利技術&#xff0c;還是數字版權&#xff0c;其安全性和可信度都直接影響著創新生態的健康發展。而作為數字安全的核心工具…

CAD插件『PDF轉CAD格式』安裝教程

在工程設計領域&#xff0c;常規流程是將完成的CAD圖紙直接轉換為PDF格式或輸出為紙質藍圖進行分發。由于PDF文件具有跨平臺兼容性強、防篡改等特性&#xff0c;在工程交付環節被廣泛采用。但當需要對既有圖紙進行二次修改時&#xff0c;PDF格式的編輯局限性便凸顯出來&#xf…

【硬件-筆試面試題】硬件/電子工程師,筆試面試題-26,(知識點:硬件電路的調試方法:信號追蹤,替換,分段調試)

目錄 1、題目 2、解答 一、信號追蹤法&#xff08;Signal Tracing&#xff09; 原理 操作步驟 應用場景 二、替換法&#xff08;Replacement Method&#xff09; 原理 操作要點 應用場景 三、分段調試法&#xff08;Segmented Debugging&#xff09; 原理 操作步驟…

Qt中QObject類的核心作用與使用

一、QObject類簡介 各位小伙伴&#xff0c;在Qt的世界里&#xff0c;QObject類就像是"萬物之母"&#xff0c;它是Qt對象模型的核心基類。幾乎所有的Qt類都直接或間接地繼承自QObject。QObject提供了很多重要的功能&#xff0c;比如對象樹管理、信號與槽機制、元對象系…

TVBOXOS6.0雙端APP二開源碼完整版全開源源碼重構版

今天介紹的TVBOXOS手機版App源碼采用了純64位的前端架構&#xff0c;版本則基于本站修正過的6.0前端進行構建。經過多次優化&#xff0c;這款應用不僅操作流暢&#xff0c;界面設計也頗具美感。前端完全集成了安卓原生Java架構&#xff0c;而后端管理采用的是PHP的如意系統。前…

VoWiFi技術深度解析:架構、流程與演進

在蜂窩網絡覆蓋盲區實現高清語音通話的秘密,就藏在這套基于IMS的Wi-Fi呼叫系統中 一、VoWiFi概述與技術價值 VoWiFi(Voice over Wi-Fi)是一種基于IMS核心網的語音通信技術,允許用戶通過Wi-Fi接入運營商的EPC(演進分組核心網)和IMS系統,實現與傳統蜂窩網絡無縫集成的語音…

DuoPlus云手機再上新:統一配置品牌型號、代理分組與便捷搜索功能全面提升!

前言&#xff1a;在這個日新月異的時代&#xff0c;每一個微小的變化都可能引領行業新潮流&#xff0c;DuoPlus云手機基于不斷創新的原則&#xff0c;把用戶的需求放在第一位&#xff0c;不斷對產品進行調整優化&#xff0c;致力于給用戶最全面的產品體驗。DuoPlus通過收集用戶…

C/C++內存陷阱:為何返回局部變量地址是“定時炸彈”?

資料合集下載鏈接: ?https://pan.quark.cn/s/472bbdfcd014? 在編程世界里,有些錯誤就像是隱藏在代碼里的“定時炸彈”,平時可能相安無事,但在某個不經意的時刻就會引爆,導致程序崩潰或出現無法解釋的詭異行為。今天,我們要拆解的,就是這樣一個極具迷惑性又極其危險的…

編程與數學 03-001 計算機組成原理 21_服務器計算機組成實例解析

編程與數學 03-001 計算機組成原理 21_服務器計算機組成實例解析一、引言二、硬件架構特點&#xff08;一&#xff09;多核/多處理器設計&#xff08;二&#xff09;大容量高帶寬內存&#xff08;三&#xff09;存儲系統&#xff08;四&#xff09;高可用性設計三、性能優化技術…

opencv簡介(附電子書資料)

概述 OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一個開源的計算機視覺和機器學習軟件庫&#xff0c;廣泛應用于圖像處理、目標檢測、模式識別等領域&#xff0c;是計算機視覺領域最常用的工具之一。電子書學習資料&#xff1a;https://pan.quark.cn…

納米編輯器之Nano 編輯器退出**的詳細操作指南

以下是關于 Nano 編輯器退出的詳細操作指南&#xff0c;涵蓋多種常見場景及技巧&#xff1a; 基礎退出與保存操作 ?保存修改并退出&#xff08;最常用&#xff09;快捷鍵觸發退出&#xff1a;按下 Ctrl X[1][2][4]。確認保存&#xff1a;若需保存改動&#xff0c;按 Y&#x…

<HMI><威綸通><觸摸屏>基于威綸通MT8106iQ觸摸屏,實現自定義登錄窗口(優化)

前言 本系列是關于PLC相關的博文,包括PLC編程、PLC與上位機通訊、PLC與下位驅動、儀器儀表等通訊、PLC指令解析等相關內容。 PLC品牌包括但不限于西門子、三菱等國外品牌,匯川、信捷等國內品牌。 除了PLC為主要內容外,PLC相關元器件如觸摸屏(HMI)、交換機等工控產品,如…

visual studio 性能調試

調試 -> 性能查看器 -> CPU使用率 -> 開始 -> 外部代碼 -> 調用樹。如果外部代碼中沒有啥東西&#xff0c;則先清理&#xff0c;再生成一遍。在 Visual Studio 中獲取類似截圖中詳細的函數級耗時分析&#xff08;尤其針對 DLL 中的函數&#xff09;&#xff0c;…

Java JVM

前言 JVM是Java的重要組成部分&#xff0c;對于我這個Cpper轉Javaer也需要認真學習才對。 一、JVM內存結構 #mermaid-svg-rYtbHArIPV8iAK9I {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-rYtbHArIPV8iAK9I .erro…

便捷刪除Android開發中XML中重復字符串資源的一個辦法

從android系統源碼中移植一些app到android studio開發的時候可能會遇到字符串重復的編譯報錯。一個辦法是把重復的刪除&#xff0c;只剩余一條即可。例如下面的編譯錯誤&#xff1a;Found item String/abc more than one time但是呢&#xff0c;xml中一般這種重復的很多很多&am…

免模型控制

文章目錄免模型控制Q-Learning 算法原理Sarsa 算法區別&#xff1a;免模型控制 免模型控制要解決的問題是&#xff0c;如何選擇動作以達到最高得分 Q-Learning 算法 原理 首先Q-Learning 確定了一個前提最優策略&#xff1a;π(s)arg?max?aQ(s,a)\pi(s) \arg\max_a Q(s,…

Vmware VSAN主機停機維護流程

當VSAN主機由于故障或進行擴容操作需要停機維護時&#xff0c;在關閉ESXi主機前和啟動ESXi主機后需要進行一些必要的檢查操作&#xff0c;以免對vSAN集群環境造成不可預知的風險&#xff0c;影響集群中的虛擬機運行。以下是vSAN集群中的ESXi主機停機維護的主要步驟。 1.確認受影…