我們使用ESP32_Arduino自帶庫: HTTPClient
一. 請求相關API函數
首先,創建一個客戶端對象
1. 初始化HTTP客戶端 http_client.begin()
/**
* 解析url以獲得所有參數,默認port是80端口
* @param url String
*/bool begin(String url);/**
* 解析url以獲得所有參數,默認port是80端口
* @param client : 傳入一個網絡連接客戶端
* @param url String
*/bool begin(WiFiClient &client, String url);/**
* 設置host port 以及uri
* @param host String(192.168.1.12,不需要帶上http://前綴)
* @param port uint16_t
* @param uri String
*/bool begin(String host, uint16_t port, String uri = '/');/**
* 設置host port 以及uri
* @param client 傳入一個網絡連接客戶端
* @param host String(192.168.1.12,不需要帶上http://前綴)
* @param port uint16_t
* @param uri String
* @param https bool 是否啟用https
*/bool begin(WiFiClient &client, String host, uint16_t port, String uri = '/', bool https = false);/**
* 設置host port 以及uri
* @param host String(192.168.1.12,不需要帶上http://前綴)
* @param port uint16_t
* @param uri String
* @param CAcert CA證書(https)
*/bool begin(String host, uint16_t port, String uri, const char* CAcert);bool begin(String host, uint16_t port, String uri, const char* CAcert, const char* cli_cert, const char* cli_key);
2. 設置長連接 http_client.setReuse(true);
/**
* try to reuse the connection to the server
* keep-alive 請求頭
* @param reuse bool
*/void setReuse(bool reuse); // keep-alive
3. setUserAgent —— 封裝標準請求頭User-Agent
/**
* set User Agent
* User Agent請求頭:使得服務器能夠識別客戶使用的操作系統及版本、CPU 類型、瀏覽器及版本、瀏覽器渲染引擎、瀏覽器語言、瀏覽器插件等。
* @param userAgent const char *
*/void setUserAgent(const String& userAgent);
4. addHeader —— 封裝自定義請求頭
函數說明:
/**
* adds Header to the request
* @param name 自定義請求頭的名字
* @param value 自定義請求頭的參數值
* @param first 是否要把當前請求頭放在請求頭的最前面
* @param replace 是否需要替換之前已經存在該請求頭的參數值,默認就是覆蓋舊值
*/void addHeader(const String& name, const String& value, bool first = false, bool replace = true);
5. GET 請求
函數說明:
/**
* 發送一個get請求
* @return http 狀態碼
*/int GET();
6. POST 請求
函數說明:
/**
* 發送一個post請求
* @param payload uint8_t * 需要提交的數據
* @param size size_t 提交的數據的字節數
* @return http 狀態碼
*/int POST(uint8_t * payload, size_t size);
/**
* 發送一個post請求
* @param payload String 需要提交的數據
* @return http 狀態碼
*/int POST(String payload);
7. PUT 請求
函數說明:
/**
* 發送一個PUT請求(博主也沒有用過PUT)
* @param payload uint8_t * 需要提交的數據
* @param size size_t 提交的數據的字節數
* @return http 狀態碼
*/int PUT(uint8_t * payload, size_t size);/**
* 發送一個PUT請求(博主也沒有用過PUT)
* @param payload String 需要提交的數據
* @return http 狀態碼
*/int PUT(String payload);
8. PATCH 請求
函數說明:
/**
* 發送一個PATCH請求(博主也沒有用過PATCH)
* @param payload uint8_t * 需要提交的數據
* @param size size_t 提交的數據的字節數
* @return http 狀態碼
*/int PATCH(uint8_t * payload, size_t size);/**
* 發送一個PATCH請求(博主也沒有用過PATCH)
* @param payload String 需要提交的數據
* @return http 狀態碼
*/int PATCH(String payload);
9. sendRequest 發送請求
GET、POST、PUT、PATCH最終都會調用sendRequest方法。
函數說明:
/**
* GET、POST、PUT、PATCH最終都會調用sendRequest方法
* sendRequest
* @param type const char * 請求類型 'GET', 'POST', ....
* @param payload String 請求攜帶的數據 data for the message body
* @return
*/int sendRequest(const char * type, String payload);/**
* sendRequest
* @param type const char * 請求類型 'GET', 'POST', ....
* @param payload uint8_t * 請求攜帶的數據 data for the message body if null not send
* @param size size_t 請求攜帶的數據字節數 size for the message body if 0 not send
* @return -1 if no info or > 0 when Content-Length is set by server
*/int sendRequest(const char * type, uint8_t * payload = NULL, size_t size = 0);/**
* sendRequest
* @param type const char * 請求類型 'GET', 'POST', ....
* @param stream Stream * 請求攜帶的數據流 data stream for the message body
* @param size size_t 數據流大小 size for the message body if 0 not Content-Length is send
* @return -1 if no info or > 0 when Content-Length is set by server
*/int sendRequest(const char * type, Stream * stream, size_t size = 0);
10. setTimeout —— 設置請求超時
函數說明:
/**
* 請求超時時間配置 ms為單位
* @param timeout unsigned int 默認500ms
*/void setTimeout(uint16_t timeout);
11. useHTTP10 —— http協議版本
函數說明:
/**
* http協議版本
* @param usehttp10 true表示用http1.0,默認是false,用http1.1
*/void useHTTP10(bool usehttp10 = true);
12. end —— 結束請求
函數說明:
/**
* 結束請求
* called after the payload is handled
*/void end(void);
二. 響應相關API
1. collectHeaders —— 設置需要收集的響應頭
函數說明:
/**
* 設置需要收集的響應頭(1-n個)
* @param headerKeys[] const char * 響應頭的名字
* @param headerKeysCount const size_t 響應頭的個數
* 注意點:headerKeys數組元素個數需要大于等于 headerKeysCount
*/void collectHeaders(const char* headerKeys[], const size_t headerKeysCount);
RequestArgument定義如下:
struct RequestArgument {
String key;//鍵值對里面的key
String value;//鍵值對里面的value};
注意點:
這個方法收集的headerKeys會在響應數據處理函數中應用到;
2. header(name) —— 獲取具體響應頭參數值
函數說明:
/**
* 獲取響應頭參數值
* @param name const char * 響應頭的名字
* @return value of headerkey(name)
*/String header(const char* name);
如果沒有調用collectHeaders(),那就會默認返回空字符串;
3. header(index) —— 獲取第index個響應頭參數值
函數說明:
/**
* 獲取第i個響應頭參數值
* @param i size_t 響應頭索引值
* @return value of header index
*/String header(size_t i);
如果沒有調用collectHeaders(),那就會默認返回空字符串;
4. headerName(index) —— 獲取第i個響應頭名字
函數說明:
/**
* 獲取第i個響應頭名字
* @param i size_t 響應頭索引值
* @return name of header index
*/String headerName(size_t i);
如果沒有調用collectHeaders(),那就會默認返回空字符串;
5. headers() —— 獲取收集響應頭個數
函數說明:
/**
* 獲取收集響應頭個數
* @return count int
*/int headers(); // get header count
6. hasHeader(name) —— 判斷是否存在某一個響應頭
函數說明:
/**
* 判斷是否存在某一個響應頭
* @param name const char* 響應頭名字
* @return bool
*/bool hasHeader(const char* name); // check if header exists
7. handleHeaderResponse —— 處理響應頭數據
函數說明:
/**
* 讀取從服務器返回的響應頭數據
* @return int http狀態碼
*/int handleHeaderResponse()
8. getString —— 獲取響應數據
函數說明:
/**
* 把響應數據轉成字符串 (可能需要很大內存空間)
* @return String 響應數據轉成字符串
*/String getString(void);
9. getStream —— 獲取響應數據的流
函數說明:
/**
* 獲取響應數據的流
* @return WiFiClient& tcp響應數據的流
*/WiFiClient& getStream(void);
10. getStreamPtr —— 獲取響應數據的流
函數說明:
/**
* 獲取響應數據的流
* @return WiFiClient& tcp響應數據的流
*/WiFiClient* getStreamPtr(void);
11. writeToStream —— 獲取響應數據的流,并寫到其他流對象
在講解該函數之前,博主先給讀者簡單介紹一下 分塊編碼(Transfer-Encoding: chunked):
Transfer-Encoding,是一個 HTTP 頭部字段(響應頭域),字面意思是「傳輸編碼」。最新的 HTTP 規范里,只定義了一種編碼傳輸:分塊編碼(chunked)。
分塊傳輸編碼(Chunked transfer encoding)是超文本傳輸協議(HTTP)中的一種數據傳輸機制,允許HTTP由網頁服務器發送給客戶端的數據可以分成多個部分。分塊傳輸編碼只在HTTP協議1.1版本(HTTP/1.1)中提供。
數據分解成一系列數據塊,并以一個或多個塊發送,這樣服務器可以發送數據而不需要預先知道發送內容的總大小。
具體方法
在頭部加入 Transfer-Encoding: chunked 之后,就代表這個報文采用了分塊編碼。這時,報文中的實體需要改為用一系列分塊來傳輸。
每個分塊包含十六進制的長度值和數據,長度值獨占一行,長度不包括它結尾的 CRLF(rn),也不包括分塊數據結尾的 CRLF。
最后一個分塊長度值必須為 0,對應的分塊數據沒有內容,表示實體結束。
/**
* 把響應數據的流寫到其他流對象
* @param Stream* 其他流對象
* @return int 寫成功的字節數
*/int writeToStream(Stream* stream);
12. getSize —— 獲取響應數據的字節數
函數說明:
/**
* 獲取響應數據字節數
* @return int 響應數據字節數
*/int getSize(void);
13. errorToString —— 獲取請求失敗響應信息
函數說明:
/**
* 根據錯誤碼error返回具體錯誤信息
* @param error 錯誤碼
* @return String 錯誤碼對應的錯誤信息
*/static String errorToString(int error);
#include char cityName[16]; char weather[32]; char temp[16]; char update[32];};//Wifi連接void setupWifi(){ delay(10); Serial.println('connecting WIFI'); WiFi.begin(ssid, password); while (!WiFi.isConnected()) { Serial.print('.'); delay(500); } Serial.println('OK'); Serial.println('Wifi connected');}void setUpHttpClient(){ req = (String)host + '/v3/weather/now.json?key='; req += apiKey; req += '&location='; req += city; req += '&language=zh-Hans&unit=c'; Serial.println(req); if (http_client.begin(req)) { Serial.println('HTTPclient setUp done!'); }}void setup(){ Serial.begin(115200); delay(3000); setupWifi(); setUpHttpClient();}void loop(){ int http_code = http_client.GET(); Serial.println(http_code); if (http_code > 0) { Serial.printf('HTTP get code: %dn', http_code); if (http_code == HTTP_CODE_OK) { rsp = http_client.getString(); Serial.println(rsp); } else { Serial.printf('fail to get cityWeather,code:%dn', http_code); } } delay(5000);}
上一篇:玩轉 ESP32 + Arduino (十五) ArduinoJSON庫(V6版本)
下一篇:玩轉 ESP32 + Arduino (十三) 通過MQTTs協議上傳數據至OneNet云平臺
推薦閱讀最新更新時間:2025-04-16 07:28

設計資源 培訓 開發板 精華推薦
- SJA1110 100Base-T1多千兆以太網交換機示例板
- MC78M09CDTRKG 9V可調輸出穩壓器的典型應用
- LT1117CM-5 用于遙感的低壓差正穩壓器的典型應用
- LT6654BHS6-1.25 擴展電源范圍電壓基準的典型應用
- SG117A 1.5A 三端可調式遙感穩壓器典型應用
- FEBFAN23SV04T_LVA,基于 FAN23SV04T 用于 DDR 端接的高效同步降壓轉換器的評估板
- LT6656BCDC-5、5V 電壓基準作為微功率穩壓器的典型應用
- LTC3526BEDC 1 節電池至 2.85V 升壓轉換器的典型應用電路
- 基于Proteus的紅外線和無線遙控仿真原理圖和單片機程序
- LTC3897IFE 高效兩相 24V 升壓轉換器的典型應用電路,具有浪涌電流控制、過流保護、輸入電壓浪涌保護和反向輸入保護