發(fā)送 GET 和 POST 請(qǐng)求(上)
GET 請(qǐng)求作為 HTTP Client 中最基礎(chǔ)的資源獲取方法,其核心定位是 “從服務(wù)器拉取指定資源”,在物聯(lián)網(wǎng)場(chǎng)景中常用于輕量級(jí)查詢操作 —— 如傳感器獲取云端配置參數(shù)、設(shè)備檢查 HTTP OTA 固件版本、控制器拉取遠(yuǎn)程控制指令等,其顯著特征是請(qǐng)求參數(shù)通過(guò) URL 拼接傳遞,無(wú)需請(qǐng)求體,且對(duì)資源的操作具有 “冪等性”(多次請(qǐng)求不會(huì)改變服務(wù)器資源狀態(tài)),這一特性使其在需重復(fù)查詢的場(chǎng)景中尤為安全。在嵌入式設(shè)備(如搭載 STM32L4+ENC28J60 的溫濕度傳感器)中,GET 請(qǐng)求的構(gòu)建需兼顧 “協(xié)議規(guī)范性” 與 “資源輕量化”:首先是 URL 的構(gòu)造,需將查詢參數(shù)以 “鍵值對(duì)” 形式拼接在 URL 路徑后,通過(guò) “?” 分隔路徑與參數(shù),多個(gè)參數(shù)間用 “&” 連接,例如檢查 OTA 版本的 URL 可設(shè)計(jì)為http://iot-gateway.com/check_ota?device_id=sn_123456¤t_version=v1.0,其中device_id用于服務(wù)器識(shí)別設(shè)備身份,current_version用于版本比對(duì);需注意的是,URL 參數(shù)中若包含特殊字符(如空格、中文),需進(jìn)行 URL 編碼(如空格編碼為%20,“溫度” 編碼為%E6%B8%A9%E5%BA%A6),嵌入式 HTTP Client(如 esp_http_client)通常提供esp_http_client_set_url接口自動(dòng)處理編碼,避免手動(dòng)拼接導(dǎo)致的協(xié)議錯(cuò)誤。
GET 請(qǐng)求的頭部構(gòu)建需精簡(jiǎn)關(guān)鍵字段以減少傳輸開(kāi)銷,尤其對(duì) RAM 僅幾 KB 的嵌入式設(shè)備而言,冗余頭字段會(huì)直接導(dǎo)致內(nèi)存溢出。核心必選字段包括Host(指定服務(wù)器域名或 IP,如Host: iot-gateway.com),用于 TCP 連接建立后定位服務(wù)器資源;User-Agent(標(biāo)識(shí)客戶端類型,如User-Agent: STM32-ENC28J60/1.0),便于服務(wù)器統(tǒng)計(jì)設(shè)備類型與版本;Connection(通常設(shè)為Keep-Alive),以復(fù)用 TCP 連接減少后續(xù)請(qǐng)求的握手開(kāi)銷??蛇x字段則根據(jù)場(chǎng)景補(bǔ)充,例如為實(shí)現(xiàn) “條件查詢” 以降低帶寬消耗,可添加If-Modified-Since頭(如If-Modified-Since: Tue, 15 Nov 2025 08:00:00 GMT),僅當(dāng)服務(wù)器資源在指定時(shí)間后更新時(shí)才返回完整數(shù)據(jù),否則返回 304 Not Modified,這對(duì)需每 5 分鐘查詢一次配置的傳感器而言,可將無(wú)效數(shù)據(jù)傳輸量減少 90% 以上。由于 GET 請(qǐng)求無(wú)請(qǐng)求體,頭部構(gòu)建完成后需以\r\n標(biāo)識(shí)頭部結(jié)束,隨后 HTTP Client 即可通過(guò)傳輸層將請(qǐng)求發(fā)送至服務(wù)器。
GET 請(qǐng)求的傳輸過(guò)程需與嵌入式硬件的網(wǎng)絡(luò)模塊深度協(xié)同,尤其在 ENC28J60 這類 SPI 接口以太網(wǎng)模塊中,需通過(guò) “輕量化指令交互” 完成數(shù)據(jù)發(fā)送與接收。當(dāng) HTTP Client 完成 GET 請(qǐng)求構(gòu)建后,首先觸發(fā) ENC28J60 的初始化:MCU 通過(guò) SPI 指令配置模塊的 MAC 地址、IP 地址(或啟用 DHCP 自動(dòng)獲取),并將模塊從睡眠模式喚醒(電流從 200nA 升至 1.6mA);隨后發(fā)起 TCP 三次握手,與服務(wù)器的 80 端口(HTTP)或 443 端口(HTTPS)建立連接 —— 若啟用 TLS 加密,ESP32 等設(shè)備會(huì)通過(guò)硬件 TLS 引擎加速握手,避免 CPU 因軟件加密占用過(guò)多時(shí)鐘周期(如 TLS 握手耗時(shí)從 500ms 縮短至 150ms)。連接建立后,MCU 通過(guò) SPI 接口向 ENC28J60 的發(fā)送緩沖區(qū)(默認(rèn) 2KB)逐字節(jié)寫(xiě)入 GET 請(qǐng)求數(shù)據(jù),寫(xiě)入順序嚴(yán)格遵循 “請(qǐng)求行→請(qǐng)求頭→空行”:先寫(xiě)入請(qǐng)求行GET /check_ota?device_id=sn_123456¤t_version=v1.0 HTTP/1.1\r\n,再依次寫(xiě)入各頭部字段(如Host: iot-gateway.com\r\n),最后寫(xiě)入\r\n標(biāo)識(shí)請(qǐng)求結(jié)束;ENC28J60 在接收完所有數(shù)據(jù)后,自動(dòng)觸發(fā)以太網(wǎng)幀發(fā)送,此時(shí)模塊電流短暫升至 12mA(接收峰值),發(fā)送完成后回落至低功耗水平。





