2023年5月11日 星期四

ESP8266 MicroPython 網路HTTP傳輸

HTTP:超文本傳輸協定,是一種用於分佈式、協作式和超媒體訊息系統的應用層協定是網際網路的數據通信的基礎,設計HTTP最初的目的是為了提供一種發佈和接收HTML頁面的方法。

Python程式或瀏覽器向Web伺服器送出HTTP請求後,才能取得回應資料的網頁內容,如左圖所示(github.com/VanHakobyan/HTTP-Protocol-Manipulation)。

所有HTTP回應的第一行都是狀態行,依次是當前HTTP版本號,3位數字組成的狀態代碼,以及描述狀態的短語,彼此由空格分隔。
狀態代碼的第一個數字代表當前回應的類型:
  • 1xx訊息——請求已被伺服器接收,繼續處理 
  • 2xx成功——請求已成功被伺服器接收、理解、並接受 
  • 3xx重新導向——需要後續操作才能完成這一請求 
  • 4xx請求錯誤——請求含有詞法錯誤或者無法被執行 
  • 5xx伺服器錯誤——伺服器在處理某個正確請求時發生錯誤
提示:本 ESP8266 實作系列是以 Thonny 為程式開發工具,並以 MicroPython 程式碼來控制 ESP8266 開發板(Wemos D1 Mini)與延伸附加的硬體裝置。 

httpbin.org網站提供HTTP請求/回應的測試服務,類似Echo服務,可以將我們送出的HTTP請求,自動以JSON格式回應送出的請求資料,HTTP方法支援GET和POST等,其網址是:http://httpbin.org,如下圖所示:

輸入http://httpbin.org/user-agent 使用者代理,可取得送出HTTP請求的客戶端資料。


MicroPython語言中的urequest模組套件能夠使用更簡單的方式來送出GET/POST的HTTP請求。在MicroPython程式中首先需要匯入模組,如下所示:
import urequests
送出簡單的GET請求。我們準備送出Google網站的GET請求,URL網址:http://www.google.com,如下所示:
import urequests
r = urequests.get("http://www.google.com")
print(r.status_code)
送出擁有參數的GET請求: 
在URL網址可以傳遞參數字串,參數是位在「?」問號之後,如果參數不只一個,請使用「&」符號分隔:
http://www.company.com?para1=value1&para2=value2
上述URL網址傳遞參數para1和para2,其值分別為「=」等號後的value1和value2。 我們準備送出http://httpbin.org/get(HTTP請求/回應的測試網站)的GET請求,和加上2個參數,如下所示:
import urequests
r = urequests.get("http://httpbin.org/get?name=justin&score=95")
print(r.text)
送出簡單的POST請求
 urequests套件是使用get()函數送出GET請求,同理,POST請求是使用post()函數,POST請求就是HTML表單送回,如同URL參數,我們需要送出表單欄位的輸入資料。 我們準備使用post()函數送出http://httpbin.org/post的POST請求,送出的資料和上一範例的參數相同,如下所示:
import urequests
post_data = '{"name": "justin", "score": 95}'
r = urequests.post("http://httpbin.org/post", data=post_data)
print(r.text)

實作:透過HTTP進行GET與POST請求取回資料
import network
import urequests

SSID = "WiFi名稱"        # WiFi名稱
PASSWORD = "WiFi密碼"    # WiFi密碼

def connect_wifi(ssid, passwd):
    sta = network.WLAN(network.STA_IF)
    sta.active(True)
    if not sta.isconnected():
       print("連線中... \n")
       sta.connect(ssid, passwd)
       while not sta.isconnected():
          pass
    print("連線成功... \n")

connect_wifi(SSID, PASSWORD)

#GET請求帶參數
print("GET請求帶參數...")
r = urequests.get("http://httpbin.org/get?X=25&Y=20")
if r.status_code == 200:  #請求成功
    print(r.encoding)
    print(r.text)

#POST請求帶參數
print("POST請求帶參數...")
data = '{ "X":15, "Y":22 }'  # JSON資料的字串
r = urequests.post("http://httpbin.org/post", data=data)
if r.status_code == 200:  #請求成功
    print(r.encoding)
    print(r.text)