娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

玩轉 ESP32 + Arduino (十四) HTTPClient庫訪問網絡資源

發布者:Joyful222Life最新更新時間:2025-04-07 來源: jianshu關鍵字:ESP32  Arduino  網絡資源 手機看文章 掃描二維碼
隨時隨地手機看文章

我們使用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 #include 'WiFi.h'#include 'HTTPClient.h'const char *ssid = 'anny';                      //wifi名const char *password = '20141208';              //wifi密碼const char *host = 'https://api.seniverse.com'; //心知天氣APIhostconst char *apiKey = 'SZihSaRrzq6LclO30';       //API key 私鑰const char *city = 'taian';                     //查詢的城市//示例: https://api.seniverse.com/v3/weather/now.json?key=your_private_key&location=beijing&language=zh-Hans&unit=cWiFiClient wifi_Client;HTTPClient http_client;String req;String rsp;class cityWeather{public:

  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  網絡資源 引用地址:玩轉 ESP32 + Arduino (十四) HTTPClient庫訪問網絡資源

上一篇:玩轉 ESP32 + Arduino (十五) ArduinoJSON庫(V6版本)
下一篇:玩轉 ESP32 + Arduino (十三) 通過MQTTs協議上傳數據至OneNet云平臺

推薦閱讀最新更新時間:2025-04-16 07:28

ESP32學習筆記(42)——硬件定時器接口使用
一、簡介 ESP32 芯片包含兩個硬件定時器組。每組有兩個通用硬件定時器。它們都是基于 16 位預分頻器和 64 位遞增/遞減計數器的 64 位通用定時器,能夠自動重新加載。 ESP-IDF 編程指南——通用定時器 二、API說明 以下硬件定時器接口位于 driver/include/driver/timer.h。 2.1 timer_init 2.2 timer_set_counter_value 2.3 timer_set_alarm_value 2.4 timer_enable_intr 2.5 timer_isr_register 2.6 timer_start 2.7 timer_get_co
[單片機]
ESP32學習筆記(26)——BLE GAP從機端廣播
一、背景 1.1 低功耗藍牙(BLE)協議棧 鏈路層(LL) 控制設備的射頻狀態,有五個設備狀態:待機、廣播、掃描、初始化和連接。 廣播 為廣播數據包,而 掃描 則是監聽廣播。 GAP通信中角色,中心設備(Central - 主機) 用來掃描和連接 外圍設備(Peripheral - 從機)。 大部分情況下外圍設備通過廣播自己來讓中心設備發現自己,并建立 GATT 連接,從而進行更多的數據交換。 也有些情況是不需要連接的,只要外設廣播自己的數據即可,用這種方式主要目的是讓外圍設備,把自己的信息發送給多個中心設備。 1.2 從機廣播 從機(外圍設備)要被主機連接,那么它就必須先被主機發現。這個時候,從機設備把自身信息以廣
[單片機]
基于ESP32的3D打印Wi-Fi機器人
ESP32 WiFi機器人是ZeroBot的縮小版本。它由同樣受歡迎的ESP32作為核心,而不是Raspberry Pi。 盡管處理能力較低,但ESP32機器人具有很多功能, 它通過WiFi傳輸彩色視頻,使用小型鋰電池,可以通過任何網絡瀏覽器精確控制。憑借4歐元的Esp32和3歐元的相機,它也非常便宜。 特征: - 全3D打印機箱,(幾乎)無需膠水 - 使用websocket接口的模擬控制 - 120x160px的低延遲流媒體(~100ms) - 定制PCB,沒有雜亂的布線 - 適用于任何3.7V LiPo電池 - Micro USB用于編程和充電 器材: ESP32不需要應用程序,可以從任何具有Web瀏覽器的PC或移動
[機器人]
LittleBits變身 加入可編程Arduino模塊
LittleBits的“世界版圖”如今擴大了一點兒,因為,它推出了全新的Arduino模塊! 什么是LittleBits 如果你對LittleBits還不太熟悉,那么在此先簡單介紹一下,它是一種可以組裝的DIY電子元件套裝,和樂高積木有些相似。可以說,它是一種 “不是玩具”的玩具。每一個“bit”都是一個獨立的電子組件,比如一個揚聲器,一個光傳感器,或是一個閃爍的LED燈。把這些電子原配件組裝在一起,就能制作出很酷的東西出來,而且沒有任何編程要求。 可能這么說還不夠直觀,舉個例子:如果你希望別人進入你房間時有聲音提示,可以將電源模塊和運動觸發器模塊連接起來,再將運動觸發器連接到蜂鳴器模塊就可以了。如果你不想使用蜂鳴器,而是喜
[嵌入式]
LittleBits變身 加入可編程<font color='red'>Arduino</font>模塊
英特爾與Arduino合作以激發創客和學生的學習和發明創造
2013年10月8日,北京——英特爾公司首席執行官科再奇(Brian Krzanich)于10月3日在羅馬創客節(Maker Faire Rome)上宣布,與創客和教育界領先開源硬件平臺公司Arduino達成合作協議。科再奇還發布了英特爾?伽利略(Intel? Galileo)電路板,這是基于英特爾架構全新兼容Arduino的可開發電路板系列的首款產品。 Arduino的開發工具包和軟件編程界面,讓沒有技術背景的藝術家、設計師和其他DIY愛好者能更容易地創建交互式對象或環境。從伽利略電路板開始,英特爾將與Arduino社區密切合作開發未來新產品,將英特爾架構的性能、可擴展性及無限可能性帶給與日俱增的創客人群。 除此之外
[嵌入式]
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 鄂尔多斯市| SHOW| 新田县| 营山县| 博白县| 普格县| 潍坊市| 徐汇区| 安国市| 包头市| 会昌县| 松溪县| 郸城县| 山西省| 嘉鱼县| 云安县| 新建县| 萍乡市| 武隆县| 贵州省| 五大连池市| 铅山县| 司法| 探索| 桓仁| 社会| 江口县| 英德市| 周口市| 保康县| 满城县| 府谷县| 东明县| 伊吾县| 安阳县| 胶州市| 吉隆县| 鲁甸县| 西安市| 政和县| 寻乌县|